我在Rails应用程序中设置了一个非常简单(我认为)的单表继承(STI)。
有一个带有嵌套资源Post的User模型。 使用STI,我有它,以便一些帖子可以是Post :: Urgent对象。
我注意到我的网址助手<%= [@user, @post] %>
需要硬编码到<%= user_post_path[@user, @post] %>
,否则我最终会看到有关Rails没有找到user_post_urgent_path
方法的错误。好的,这相当容易。
(另一种方法是<%= [@user, post: @post] %>
。)
好吧,出于某种原因,我无法弄清楚如何以同样的方式调整form_for
方法。当我写简单时
<%= form_for [@user, @post] do |f| %>
,我在URL帮助器案例中遇到了类似的错误,但是在表单上下文中:undefined method 'user_post_urgen_path'
。
我通过指定:
来解决这个问题<%= form_for [@user, @post], url: :user_post do |f| %>
但这并不完全有效,因为当我提交表单时,我的控制器出现问题,说强参数行params.require(:post)
失败了:
param is missing or the value is empty: post
如果我检查params
,我发现表单正在传递post_urgent
对象,而不是post
对象。
当然,我可以手动输入一些总是说if !params[:post] and params[:post_urgent], then params[:post] = params[:post_urgent]
的逻辑。但这似乎方式过于hacky,特别是对于Rails。
有没有更好的方法来制作这样的表格&#34;只是工作&#34;不管Post模型的哪个子类实际上是什么?
答案 0 :(得分:14)
不确定您是否已找到解决方案,但我正在使用以下表格
= form_for [@user, @post.becomes(Post)] do |f|
- f.object = @post.becomes @post.class
参考:http://thepugautomatic.com/2012/08/rails-sti-and-form-for/
答案 1 :(得分:0)
我在控制器中初始化了一些嵌套模型,由于某些原因,空的未保存模型可以与accepts_nested_attribues_for
和becomes
一起使用,因此出于某种原因清空了它们,所以我对控制器使用了强参数,而不是最干净的参数,我知道。
def unpermitted_model_params
polymorphic_form_params = params.to_unsafe_hash
.slice('sub_model1', 'sub_model2')
form_values = polymorphic_form_params.first.to_a.second
ActionController::Parameters.new(parent_model: form_values)
end
def allowed_params
unpermitted_model_params.require(:parent_model)
.permit(:type, :etc, :etc)
end