0

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

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

在我的“新/编辑”测验表格上,我想要一个选择框来选择正确的图标。此刻我有...

<%= 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 ,但这两个选项似乎都不是正确的做事方式。

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

谢谢!

4

2 回答 2

2

就放

attr_accessible :icon_id

在您的测验模型中。

来自 Ruby on rails api:attr_accessible:指定可以通过批量分配设置的模型属性白名单。

于 2012-07-17T03:13:55.350 回答
2

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

快速历史课:

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

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

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

于 2012-07-17T03:25:26.213 回答