Rails 4强参数 - 处理缺失的模型参数哈希

时间:2013-06-27 22:09:01

标签: ruby-on-rails-4 strong-parameters

型号: 帖子和用户

发布belongs_to:用户
用户has_many:帖子

简单。

假设存在少数用户,我们会访问帖子的编辑页面。

<%= form_for @post do |f| %>

...

<% User.all.each do |user| %>
  <div><%= f.radio_button "user_id", user.id %></div>
<% end %>

...

Post's Controller利用Rails 4强大的参数。

params.require(:post).permit(:user_id)

假设编辑帖子表单只有单选按钮作为字段。

问题:抛出ActionController :: ParameterMissing异常。未找到参数:发布

永远不会创建Post Params哈希的原因,导致抛出上述异常。与空文本字段不同,空单选按钮不会触发要创建的模型的参数哈希。

如果Post模型要求user_id有效,该怎么办?当然,人们会想要再次渲染视图,原因是无法保存帖子。

问题:在坚持使用Rails惯例时,处理这种情况的优雅方法是什么?

更新

进一步集思广益,我确信可能有很多其他情况会产生这个问题;它不一定对应于单选按钮。

2 个答案:

答案 0 :(得分:29)

我有类似的问题,并且不喜欢这些答案中的任何一个。在rails文档(http://guides.rubyonrails.org/action_controller_overview.html#more-examples)中,我看到了以下解决方案:

params.fetch(:blog, {}).permit(:title, :author)

实际上,您提供的默认值为{},这似乎运作得很好(至少在我的情况下)。

申请代码,您必须:

params.fetch(:post, {}).permit(:user_id)

我认为这相当干净,似乎可以在我的代码中使用。

答案 1 :(得分:4)

这是我的直接解决方案......虽然看起来有点傻但是如果你明显在后控制器中你为什么还要检查post params并且你还是需要它们。似乎非常违反直觉。这真的是最好的方式吗?

  params.require(:post).permit(:user_id) if params[:post]