我如何为两个相关模型制作一个表格?
How do i make one form for two related models?
我想为 2 个相互关联的不同模型编写数据,如下所示:
class Post < ActiveRecord::Base
has_many :roads
accepts_nested_attributes_for :roads, :allow_destroy => true
end
class Road < ActiveRecord::Base
belongs_to :post
end
当然 de roads table 有一个 "post_id column"。 post 视图中的 form_for 看起来像这样
<%= form_for @post do |f| %>
<div class="form-group">
<%= f.label :Tu_Nombre %>
<%= f.text_field :creador, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :año %> (Cuando fue tu experiencia?)
<%= f.text_field :año, class: "form-control" %>
</div>
<div class="form-group">
<%= fields_for :roads do |r| %>
<%= r.label :principio %> (desde?)
<%= r.text_field :principio, class: "form-control" %>
<%= r.label :final %> (hasta?)
<%= r.text_field :final, class: "form-control" %>
<% end %>
</div>
<div class="form-group">
<%= f.label :historia %> (Cuentanos la historia de tu viaje!)
<%= f.text_area :historia, class: "form-control", size: "50x15" %>
</div>
<div>
<%= f.submit class: "btn btn-success" %>
</div>
<% end %>
最后是我的 posts_controller 创建方法
def create
@post = Post.new(post_params)
if @post.save
redirect_to @post, notice: 'Post was successfully created.'
else
render :new
end
end
与私人
def post_params
params.require(:post).permit(:historia, roads_attributes: [:pricipio, :final, :post_id])
end
post 已提交,如果我检查控制台,post 的所有属性都已保存,但道路属性尚未保存。我怎样才能只使用一种形式为这两个模型制作记录并且 post_id 得到注册以便我可以关联 tables?
非常感谢!!
请阅读 Rails 指南的表单助手章节中的 Nested Forms。您可以使用 fields_for
为您的 roads
构建嵌套属性表单,并像示例一样允许嵌套属性。以下是 rails 指南中的示例,您可以自己尝试理解。
_form.html.erb
<%= form_for @person do |f| %>
Addresses:
<ul>
<%= f.fields_for :addresses do |addresses_form| %>
<li>
<%= addresses_form.label :kind %>
<%= addresses_form.text_field :kind %>
<%= addresses_form.label :street %>
<%= addresses_form.text_field :street %>
...
</li>
<% end %>
</ul>
<% end %>
允许 people_controller.rb
中的嵌套属性
def person_params
params.require(:person).permit(:name, addresses_attributes: [:id, :kind, :street])
end
像这样将您的 fields_for 附加到父表单生成器:
<%= f.fields_for :roads do |r| %>
更新您的 posts_controller new
方法以包含 .build
def new
@post = Post.new
@post.roads.build
end
我想为 2 个相互关联的不同模型编写数据,如下所示:
class Post < ActiveRecord::Base
has_many :roads
accepts_nested_attributes_for :roads, :allow_destroy => true
end
class Road < ActiveRecord::Base
belongs_to :post
end
当然 de roads table 有一个 "post_id column"。 post 视图中的 form_for 看起来像这样
<%= form_for @post do |f| %>
<div class="form-group">
<%= f.label :Tu_Nombre %>
<%= f.text_field :creador, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :año %> (Cuando fue tu experiencia?)
<%= f.text_field :año, class: "form-control" %>
</div>
<div class="form-group">
<%= fields_for :roads do |r| %>
<%= r.label :principio %> (desde?)
<%= r.text_field :principio, class: "form-control" %>
<%= r.label :final %> (hasta?)
<%= r.text_field :final, class: "form-control" %>
<% end %>
</div>
<div class="form-group">
<%= f.label :historia %> (Cuentanos la historia de tu viaje!)
<%= f.text_area :historia, class: "form-control", size: "50x15" %>
</div>
<div>
<%= f.submit class: "btn btn-success" %>
</div>
<% end %>
最后是我的 posts_controller 创建方法
def create
@post = Post.new(post_params)
if @post.save
redirect_to @post, notice: 'Post was successfully created.'
else
render :new
end
end
与私人
def post_params
params.require(:post).permit(:historia, roads_attributes: [:pricipio, :final, :post_id])
end
post 已提交,如果我检查控制台,post 的所有属性都已保存,但道路属性尚未保存。我怎样才能只使用一种形式为这两个模型制作记录并且 post_id 得到注册以便我可以关联 tables?
非常感谢!!
请阅读 Rails 指南的表单助手章节中的 Nested Forms。您可以使用 fields_for
为您的 roads
构建嵌套属性表单,并像示例一样允许嵌套属性。以下是 rails 指南中的示例,您可以自己尝试理解。
_form.html.erb
<%= form_for @person do |f| %>
Addresses:
<ul>
<%= f.fields_for :addresses do |addresses_form| %>
<li>
<%= addresses_form.label :kind %>
<%= addresses_form.text_field :kind %>
<%= addresses_form.label :street %>
<%= addresses_form.text_field :street %>
...
</li>
<% end %>
</ul>
<% end %>
允许 people_controller.rb
中的嵌套属性def person_params
params.require(:person).permit(:name, addresses_attributes: [:id, :kind, :street])
end
像这样将您的 fields_for 附加到父表单生成器:
<%= f.fields_for :roads do |r| %>
更新您的 posts_controller new
方法以包含 .build
def new
@post = Post.new
@post.roads.build
end