在RoR中,f.fields_for呈现为空

时间:2016-07-27 14:55:56

标签: forms ruby-on-rails-4 associations parent fields-for

我正在使用Rails 4.2.7。在我的模型中我有

class MyObject < ActiveRecord::Base
    …
  belongs_to :address, :autosave => true, dependent: :destroy

  accepts_nested_attributes_for :address, :my_object_times

和地址模型

class Address < ActiveRecord::Base
  belongs_to :state
  belongs_to :country
  ...
  has_one :my_object

end

我想写一个允许我构建子对象和父对象的表单,所以我尝试了

<%= form_for @my_object, :url => my_objects_create_path, :remote => true do |f| %>

  <div class="field">
    <%= f.fields_for :address do |addr| %>
    <%= addr.label :address %> <span name="my_object[address]_errors"></span><br>
    City: <%= addr.text_field :city %>
    <%= addr.select :state, options_for_select(us_states.collect{|s| [ s.name, s.id ]}), {:prompt => "Select State"} %>
    <%= country_code_select('my_object[address]', 'country_id',
              [[ 'US', 'United States' ], [ 'CA', 'Canada' ]],
              {:include_blank=>true, :selected => @default_country_selected.id},
              {:class=>'countryField'}
              ) %>
    <% end %>
  </div>

但上面仅作为

呈现
<div class="field">
</div>

如何调整内容以便我的字段呈现并且我可以使用

在控制器中创建对象
my_object = MyObject.new(params) 

编辑:根据给出的答案,我试过

@my_object.address.build

来自控制器行动taht rendres表格,但得到了erorr

undefined method `build' for nil:NilClass

2 个答案:

答案 0 :(得分:1)

如果my_object没有地址,则不会呈现任何内容。这是Rails中的默认行为。解决此问题的一种方法是在控制器中构建一个或多个空子项,以便向用户显示至少一组字段

Rails guides在嵌套表单第9.2节

中讨论这个问题

此外,在MyObject模型中,我认为它应该是has_one address。你有belongs_to

class MyObject < ActiveRecord::Base
  has_one :address, :autosave => true, dependent: :destroy
  accepts_nested_attributes_for :address
end

答案 1 :(得分:1)

#这是表单加载类

def new
    @myobject = MyObject.new
    @myobject.address = Address.new
end

#现在您可以使用地址

的嵌套属性
<%=form_for(@myobject) do |f|%>
<%=f.fields_for :address do |a|%>
    Your form fields here
    <%end%>
<%end%>

#这是创建def

def create 
@myobject = MyObject.new(myobject_params)
@myobject.save
end

#in params

def myobject_params
params.require(:myobject).permit(:some, :key,:of, :myobject, :address_attributes[:address, :attribute])
end

#这应该有用