Rails form_for 使用 STI 基础 class
Rails form_for that uses STI base class
我的 Rails 应用程序中有一个非常简单的(我认为)单 table 继承 (STI) 设置。
有一个带有嵌套资源的用户模型 Post。
使用 STI,我有一些 Posts 可以是 Post::Urgent 个对象。
我注意到像 <%= [@user, @post] %>
这样的 URL 助手需要硬编码为 <%= user_post_path[@user, @post] %>
否则我最终会看到关于 Rails not finding 的错误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]
的逻辑。但这似乎 太老套了,尤其是 Rails.
有没有更好的方法来制作这样的表单 "just work" 而不管它实际上是 Post 模型的哪个子类?
不确定您是否已经找到解决方案,但我在我的表格中使用了以下内容
= form_for [@user, @post.becomes(Post)] do |f|
- f.object = @post.becomes @post.class
参考:http://thepugautomatic.com/2012/08/rails-sti-and-form-for/
我在控制器中初始化了一些嵌套模型,清空未保存的模型以与 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
我的 Rails 应用程序中有一个非常简单的(我认为)单 table 继承 (STI) 设置。
有一个带有嵌套资源的用户模型 Post。 使用 STI,我有一些 Posts 可以是 Post::Urgent 个对象。
我注意到像 <%= [@user, @post] %>
这样的 URL 助手需要硬编码为 <%= user_post_path[@user, @post] %>
否则我最终会看到关于 Rails not finding 的错误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]
的逻辑。但这似乎 太老套了,尤其是 Rails.
有没有更好的方法来制作这样的表单 "just work" 而不管它实际上是 Post 模型的哪个子类?
不确定您是否已经找到解决方案,但我在我的表格中使用了以下内容
= form_for [@user, @post.becomes(Post)] do |f|
- f.object = @post.becomes @post.class
参考:http://thepugautomatic.com/2012/08/rails-sti-and-form-for/
我在控制器中初始化了一些嵌套模型,清空未保存的模型以与 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