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