19

模型:帖子和用户

Post belongs_to :user
用户 has_many :posts

简单的。

假设存在一些用户,我们访问帖子的编辑页面。

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

...

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

...

Post 的控制器利用 Rails 4 强大的参数。

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

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

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

原因是 Post params 哈希从未创建,导致上述异常被抛出。与空文本字段不同,空单选按钮不会触发创建模型的参数散列。

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

问题:在遵守 Rails 约定的同时处理这种情况的优雅方法是什么?

更新:

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

4

2 回答 2

31

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

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

实际上,您提供了默认的 {},这似乎工作得很好(至少对于我的情况而言)。

应用到您的代码,您将拥有:

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

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

于 2014-03-16T23:07:52.990 回答
4

这是我的直接解决方案......虽然它看起来有点傻,因为如果你清楚地在后控制器中并且你仍然需要它们,为什么你必须检查后参数。似乎非常违反直觉。这真的是最好的方法吗?

  params.require(:post).permit(:user_id) if params[:post]
于 2013-06-27T22:09:00.643 回答