Rails form_for使用STI基类

时间:2015-10-24 01:25:31

标签: ruby-on-rails forms inheritance polymorphic-associations sti

我在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模型的哪个子类实际上是什么?

2 个答案:

答案 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_forbecomes一起使用,因此出于某种原因清空了它们,所以我对控制器使用了强参数,而不是最干净的参数,我知道。

  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