【发布时间】:2013-01-31 05:35:09
【问题描述】:
我正在关注来自 PeepCode 的(现在稍微过时的)Meet Rails 3 教程,但在获取教程中的一些建议以与 Rails 3.2 一起使用时遇到了问题。
本教程让您创建一个属于Project 的Role 模型:
class Role < ActiveRecord::Base
belongs_to :project
validates :project_id, :presence => true
attr_protected :project_id
end
routes.rb 文件嵌套了Role 资源,因此您必须在Project 的上下文中使用Role:
resources :projects do
resources :roles
end
注意在上面的模型代码中,本教程建议您使用attr_protected 来保护:project_id 字段,因为可以通过在项目上下文中创建每个Role 来“更安全”地设置它,例如这在 roles_controller.rb 中:
class RolesController < ApplicationController
⋮
def create
@role = project.roles.new(params[:role])
⋮
问题是,用于创建Role 的HTML 表单是用Formtastic 创建的,其中包含用于选择项目的project_id 字段。因此,当project.roles.new(params[:role]) 尝试使用表单中的参数来填充新的Role 对象时,它会尝试使用批量赋值来设置project_id,但失败并显示:
ActiveModel::MassAssignmentSecurity::RolesController#create 中的错误
无法批量分配受保护的属性:project_id
公认的实现方式是什么?保护project_id 属性是个坏主意吗?或者有什么方法可以用表单数据填充新的Role,而不包括project_id?
【问题讨论】:
标签: ruby-on-rails-3.2 formtastic