使用STI基类的Rails form_for。

问题描述 投票:9回答:2

在我的Rails应用中,我有一个非常简单(我认为)的单表继承(STI)设置。

有一个User模型,其中有一个嵌套资源Post.使用STI,我让它成为一些Post::Urgent对象。

我注意到我的URL助手,比如 <%= [@user, @post] %> 需要硬编码以 <%= user_post_path[@user, @post] %> 否则,我就会看到Rails找不到 user_post_urgent_path 方法。好吧,这是合理的简单。

(另一种方法也是) <%= [@user, post: @post] %>.)

好吧,由于某些原因,我无法找出如何使 form_for 的方法进行调整。当我简单地写

<%= form_for [@user, @post] do |f| %>

我得到了类似于URL helper情况下的错误,但在表单上下文中。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]. 但是,这似乎只是 途径 太黑了,尤其是对Rails来说。

有没有更好的方法让这样的表单 "正常工作",不管它实际上是Post模型的哪个子类?

ruby-on-rails forms inheritance polymorphic-associations sti
2个回答
17
投票

不知道你是否已经找到了解决方案,但我在我的表单中使用了以下方法

= form_for [@user, @post.becomes(Post)] do |f|
  - f.object = @post.becomes @post.class

参考。http:/thepugautomatic.com201208rails-sti-and-form-for。


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
© www.soinside.com 2019 - 2024. All rights reserved.