在 RoR 中,f.fields_for 呈现为无
In RoR, f.fields_for is rendering as nothing
我正在使用 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 渲染表单,但出现错误
undefined method `build' for nil:NilClass
如果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
#这是在表单加载中class
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 create
@myobject = MyObject.new(myobject_params)
@myobject.save
end
#in 参数
def myobject_params
params.require(:myobject).permit(:some, :key,:of, :myobject, :address_attributes[:address, :attribute])
end
#这应该有效
我正在使用 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 渲染表单,但出现错误
undefined method `build' for nil:NilClass
如果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
#这是在表单加载中class
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 create
@myobject = MyObject.new(myobject_params)
@myobject.save
end
#in 参数
def myobject_params
params.require(:myobject).permit(:some, :key,:of, :myobject, :address_attributes[:address, :attribute])
end
#这应该有效