当嵌套obj上show / edit为null时,使用fields_for和accepts_nested_attributes_for

时间:2015-09-21 22:11:38

标签: ruby-on-rails ruby

编辑:所以我可以输入表格并点击提交,在show.html.erb我收到此错误:

undefined method 'address_line_one' for nil:NilClass

这一行是否意味着没有mailing_address?

 <%= @group.mailing_address.address_line_one %>

即使我在下面的fields_for获得了这些信息,并且应该将其保存在提交中......但我认为我强大的参数下面会阻止mail_address被保存。如果您查看我的模型,您可以看到mailing_address的使用方式(也是我控制器中的新操作)

原帖:

使用此博客进行嵌套表单:

https://currentricity.wordpress.com/2011/09/04/the-definitive-guide-to-accepts_nested_attributes_for-a-model-in-rails-3/

效果很好,或者似乎也是如此。新的动作渲染得很好,我可以输入信息,当我点击提交它说它已保存并显示我的节目动作

但是节目中的@ group.mailing_address似乎不存在(这意味着点击这里的编辑也不会在field_for中显示任何内容)

我猜这与我的def group_params有关,但不确定我做错了什么。

group Show rb snippet:

<p>
  <strong>Group tin:</strong>
  <%= @group.tin %>
</p>

<p>
  <strong>Group Address:</strong>
  <%= @group.mailing_address.address_line_one %> <!-- dies here nil class -->
  <%= @group.mailing_address.address_line_two %> <br />
  <%= @group.mailing_address.city%>, <%= @group.mailing_address.state %> <%= @group.mailing_address.zip %>
</p>

小组模特:

class Group < ActiveRecord::Base

    belongs_to  :mailing_address, class_name: 'Address', foreign_key: 'mailing_address_id'
    accepts_nested_attributes_for :mailing_address

end

集团控制人:

 def show
    #@group = Group.find(params[:id])
 end

 def new
    #is this right?
    @group=Group.new       
    @group.build_mailing_address

    respond_to do |format|
        format.html # new.html.erb
        format.json { render json: ghouse }
     end
  end

  def create
    @group = Group.new(group_params)

    respond_to do |format|
        if @group.save
            format.html { redirect_to @group, notice: 'Group was successfully created.'}
            format.json { render :show, status: :created, location: @group }
        else
            format.hmtl { render :new }
            format.json { render json: @group.errors, status: :unprocessable_entity }
        end
    end
  end

真正重要的部分:

    # Never trust parameters from the scary internet, only allow the white list through.
def group_params
  params.require(:group).permit(:group_name, :group_contact, :tin, :npi, :notes, :mailing_address)
end

为了完整性,使用fields_for

的_form.html.erb代码段
<td>                    
    <%= f.fields_for :mailing_address do |builder| %>
    <div class="field">
       <%= builder.label :address_line_one %><br />
       <%= builder.text_field :address_line_one %><br >
       <%= builder.label :address_line_two %><br />
       <%= builder.text_field :address_line_two %><br />
       <%= builder.label :city %><br />
       <%= builder.text_field :city %> <br />
       <%= builder.label :state %><br />
       <%= builder.text_field :state %> <br />
       <%= builder.label :zip %><br />
       <%= builder.text_field :zip %> <br />
    </div>
   <% end -%>                                                                       
</td>

1 个答案:

答案 0 :(得分:1)

:mailingaddress应该是mailing_address_attributes: [address_line_one, address_line_two, ...etc]方法中的group_params

http://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html http://apidock.com/rails/ActionView/Helpers/FormHelper/fields_for

如果你的编辑操作为零,你还需要添加一个build_mailing_address,以便在编辑时适当地显示fields_for:

@group.build_mailing_address if @group.mailing_address.nil?