Rails belongs_to和has_many关系问题

时间:2012-07-17 02:12:36

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

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

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

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:2)

刚刚放

attr_accessible :icon_id

在您的测验模型中。

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

答案 1 :(得分:2)

TL; DR:Rails有一个称为质量赋值的功能,当你传入params [:quiz]哈希时,这就是你正在做的事情。您需要为要使用质量分配更新的任何属性指定attr_accessible。

快速历史课程:

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

几个月前,github上有一个高度宣传的剧集,有人能够利用这个功能来构建一个带有某种效果的帖子体[:admin] = true。这有效地为用户提供了管理员访问权限,因为应用程序并没有阻止任何人设置admin = true。有一种方法可以防止这种情况,但开发人员错过了它。

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