【问题标题】:Rails belongs_to and has_many relationships problemsRails 的 belongs_to 和 has_many 关系问题
【发布时间】:2012-07-17 02:12:36
【问题描述】:

我对 Rails 很陌生,正在构建我的第一个“真正的”应用程序并且努力了解如何使关系正常工作。

我有一个 Quiz 模型和 Icon 模型。每个测验都属于_一个图标,一个图标有_许多测验。 (将图标视为一个类别)。

在我的“新建/编辑”测验表单上,我想要一个选择框来选择正确的图标。目前我...

<%= collection_select(:quiz, :icon_id, Icon.all, :id, :title, :prompt => true) %>

在我的测验控制器中创建动作我有...

def create
   @icon = Icon.find(params[:quiz][:icon_id])
   @quiz = @icon.quizzes.build(params[:quiz])
   if @quiz.save
     flash[:success] = "New quiz created successfully!"
     redirect_to @quiz
   else
     render 'new'
   end
end

当我提交表单时,我得到一个

Can't mass-assign protected attributes: icon_id

我理解为 icon_id 的错误在模型中未指定为 attr_accessible。

我可以使其可访问,因为没有真正的安全风险,或者我可以在传递给构建方法之前从测验哈希中删除 icon_id,但这两个选项似乎都不是正确的做事方式。

这样做的正确方法是什么?

谢谢!

【问题讨论】:

  • 如果您希望能够以这种方式设置它,则必须将 icon_id 添加到 attr_accessible ......这似乎是您需要能够做的。这是完全正常的。您正在为测验记录设置 icon_id 列。
  • 很高兴知道这样做是正常的。谢谢!

标签: ruby-on-rails ruby-on-rails-3


【解决方案1】:

随便放

attr_accessible :icon_id

在您的测验模型中。

来自 Ruby on rails api:attr_accessible: Specifies a white list of model attributes that can be set via mass-assignment.

【讨论】:

  • 很高兴知道这是这样做的方法。谢谢。
【解决方案2】:

TL;DR:Rails 有一个名为 mass assignment 的功能,当您传入 params[:quiz] 哈希时,您正在执行此操作。您需要为要使用批量分配更新的任何属性指定 attr_accessible。

快速历史课:

过去默认情况下所有属性都是可批量分配的,因此您的代码可以正常工作。

几个月前,在 github 上发生了一个广为人知的事件,有人能够通过构建一个具有 user[:admin] = true 效果的帖子正文来利用此功能。这有效地为用户提供了管理员访问权限,因为应用程序并没有阻止任何人设置 admin = true。有一种方法可以防止这种情况发生,但开发人员错过了。

Rails 对此的回应是默认保护所有属性,迫使开发人员明确指定可通过批量分配更新的任何字段。我相信这是在 3.2.3 版本中。

【讨论】:

  • 感谢道格的精彩解释!赞赏。
猜你喜欢
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多