Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Helper "fields_for" not working

I'm using nested attributes, but the fields aren't loaded in my view. Someone know what I missing?

Rails 3.1, Ruby 1.9.2

Model 1:

class Traditions::Material < ActiveRecord::Base
  has_one :material_asset, :dependent => :destroy
  validates_presence_of :title
  accepts_nested_attributes_for :material_asset
end

Model 2:

class Traditions::MaterialAsset < ActiveRecord::Base
  belongs_to :material
  has_attached_file :asset
  validates_attachment_presence :asset
end

View (HAML):

= form_for @material, :html => {:class => 'form', :multipart => true} do |f|
    = errors_for @material

    .field
        = f.label :title
        = f.text_field :title

    .field
        = f.label :description
        = f.text_area :description, :rows => 5

    .field
        = f.fields_for :material_asset do |ma|
            = ma.label :asset
            = ma.file_field :asset

    .buttonrow
        = f.submit 'Save'

Result HTML (part):

<div class='field'></div>
<div class='buttonrow'>
  <input name="commit" type="submit" value="Save" />
</div>

In above, div.field is empty.

like image 800
Edison Machado Avatar asked May 22 '11 04:05

Edison Machado


2 Answers

I stumbled across this from your rails issue, which appears to be not building the nested resource in your new action.

Are you calling build_material_asset in your controller? That could explain why the fields aren't getting rendered. If the nested object is nil, there are no object to render fields for.

Try something like this:

class MaterialsController < ApplicationController
  def new
    @material = Traditions::Material.new
    @material.build_material_asset
  end
end
like image 68
theTRON Avatar answered Oct 17 '22 13:10

theTRON


fields_for has new syntax.

= fields_for :plan, @plan do |builder| ...

in controller (action new) :

@plan = Parent.plans.new

read more here: http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_for

like image 3
Davidslv Avatar answered Oct 17 '22 14:10

Davidslv