Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3.2 为具有受保护ID属性的嵌套资源创建方法_Ruby On Rails 3.2_Formtastic - Fatal编程技术网

Ruby on rails 3.2 为具有受保护ID属性的嵌套资源创建方法

Ruby on rails 3.2 为具有受保护ID属性的嵌套资源创建方法,ruby-on-rails-3.2,formtastic,Ruby On Rails 3.2,Formtastic,我正在遵循PeepCode中现在稍微过时的教程,并且很难获得教程中的一些建议来与Rails 3.2配合使用 本教程要求您创建属于项目的角色模型: 注意:在上面的模型代码中,教程建议您使用attr_protected来保护:project_id字段,因为可以通过在项目上下文中创建每个角色来“更安全地”设置该字段,如roles_controller.rb中所示: 问题是,用于创建角色的HTML表单(使用创建)包含用于选择项目的项目id字段。因此,当project.roles.newparams[:r

我正在遵循PeepCode中现在稍微过时的教程,并且很难获得教程中的一些建议来与Rails 3.2配合使用

本教程要求您创建属于项目的角色模型:

注意:在上面的模型代码中,教程建议您使用attr_protected来保护:project_id字段,因为可以通过在项目上下文中创建每个角色来“更安全地”设置该字段,如roles_controller.rb中所示:

问题是,用于创建角色的HTML表单(使用创建)包含用于选择项目的项目id字段。因此,当project.roles.newparams[:role]尝试使用表单中的参数填充新角色对象时,它尝试使用mass assignment设置项目id,但失败原因如下:

ActiveModel::MassAssignmentSecurity::角色控制器创建中出错 无法批量分配受保护的属性:项目\u id

实现这一点的公认方式是什么?保护项目id属性是个坏主意吗?或者是否有某种方法可以在不包含项目id的情况下使用表单数据填充新角色?

如果您是通过参数[:project\u id]而不是参数[:Role][:project\u id]获取项目,那么您实际上可能设置了冲突的值

Mass Assignment希望保护这一点的原因是防止用户为project_id输入任意值,该值可能允许不受此用户控制的项目。你有两个选择

如果对象附加了授权用户或帐户,则可以添加before_save回调,例如self.project_id=nil,除非user.projects.findproject_id

既然你不知道,我就用散列中的project\u id来找到这个项目,然后返回到route id,我不确定它是project\u id还是仅仅是我脑海中的id

def create
  user.
    projects.
    find(params[:role].delete(:project_id) || params[:project_id] || params[:id]).
    create(params[:role])

最简单的方法是从表单中删除选择框,因为他们在选择创建新角色时选择了一个项目–这是一个嵌套资源。

实际上,本教程的下一步将重新写入formtastic表单,使其不再包含项目下拉列表。该错误虽然在教程中从未提及,但已通过该更改得到修复。
resources :projects do
  resources :roles
end
class RolesController < ApplicationController
  ⋮

  def create
    @role = project.roles.new(params[:role])
    ⋮
def create
  user.
    projects.
    find(params[:role].delete(:project_id) || params[:project_id] || params[:id]).
    create(params[:role])