我有模型A和模型B,关系是A has_many B(和B belongs_to A)。我有一个模型,一个控制器和A的视图,只有一个B.的模型。 我想在A(url / a / 1 / edit)的编辑视图中创建和编辑B的实例。
我知道我可以为B创建一个控制器并使用A视图中的表单调用这些方法,但是我需要重定向回A的视图,因为我不想要B的实际视图。 / p>
有推荐的方法吗?我想要的是不要破坏rails提供的任何帮助(例如,在转发之后,我认为获取错误消息和类似的东西很痛苦。)
提前致谢!
答案 0 :(得分:1)
在模型级别,您将使用accepts_nested_attributes_for
。
ILogger
这使A通过传递带有属性数组的属性class A < ApplicationModel
has_many :bs
accepts_nested_attributes_for :bs
validates_associated :bs
end
class B < ApplicationModel
belongs_to :a
end
来获取属性并创建嵌套的bs
。 validates_associated
可用于确保bs_attributes
无法保留A也无效。
创建nested form fields使用fields_for
bs
要whitelist nested attributes使用带有子记录的允许属性数组的哈希键:
<%= form_for(@a) do |f| %>
# field on A
<%= f.text_input :foo %>
# creates a fields for each B associated with A.
<%= f.fields_for(:bs) do |b| %>
<%= b.text_input :bar %>
<% end %>
<% end %>
创建新记录时,您还必须“播种”#34;如果您希望存在用于创建嵌套记录的输入,则使用该表单:
params.require(:a)
.permit(:foo, bs_attributes: [:id, :bar])
修改强>
seed_form也可以只添加一个并且每次都这样做。所以你总会有一个空的&#34;一个要添加。您需要确保在保存之前过滤掉空的,如果未将class AsController < ApplicationController
def new
@a = A.new
seed_form
end
def create
@a = A.new(a_params)
if @a.save
redirect_to @a
else
seed_form
render :new
end
end
def update
if @a.update(a_params)
redirect_to @a
else
render :edit
end
end
private
def seed_form
5.times { @a.bs.new } if @a.bs.none?
end
def a_params
params.require(:a)
.permit(:foo, bs_attributes: [:id, :bar])
end
end
更改为:
accepts_nested_attributes_for