我对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,但这两个选项似乎都不是正确的做法。
这样做的正确方法是什么?
谢谢!
答案 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版本中。