1

我需要创建一个允许创建和更新项目的 CRUD,其中一个属性是拥有该项目的客户端。创建或编辑项目时,使用选择标签选择客户端。

我有这个模型:

class Cliente < ActiveRecord::Base
  attr_accessible :nombre
  has_many :proyectos
end

class Proyecto < ActiveRecord::Base
  attr_accessible :nombre, :cliente_id
  belongs_to :cliente
end

这个控制器:

class ProyectosController < ApplicationController
  def new
    @proyecto = Proyecto.new
    @clientes = Cliente.order(:nombre)
  end

  def edit
    @proyecto = Proyecto.find(params[:id])
    @clientes = Cliente.order(:nombre)
  end

  def create
    @proyecto = Proyecto.new(params[:proyecto])
      if @proyecto.save
        redirect_to @proyecto, notice: 'Proyecto was successfully created.'
      else
        render action: "new"
      end
    end
  end

  def update
    @proyecto = Proyecto.find(params[:id])
    if @proyecto.update_attributes(params[:proyecto])
        redirect_to @proyecto, notice: 'Proyecto was successfully updated.'
      else
        render action: "edit"
    end
  end
end

和视图上的这个表格(在haml中):

= form_for @proyecto do |f|
  = f.label :cliente
  = f.collection_select :cliente_id, @clientes, :id, :nombre
  = f.label :nombre
  = f.text_field :nombre
  = f.submit 'Save'

代码是用脚手架生成的,我只是删除了不必要的部分并添加了代码来创建选择。

最初,在 Proyecto 模型上,我有这个:

attr_accessible :nombre

但收到错误“无法批量分配受保护的属性:cliente_id”。在这里在stackoverflow上搜索类似的问题,发现必须将cliente_id添加到attr_accessible,但在google上搜索也发现由于安全问题,我必须不添加外键到attr_accessible,这是矛盾的。

这是对我的创建和更新方法进行编码的正确方法,将 cliente_id 添加到 attr_accessible?如果没有,正确的方法是什么?

我正在使用 rails 3.2.8 和 ruby​​ 1.9.3p194

4

1 回答 1

2

在这种情况下,您必须将 client_id 作为 attr_accessible。原因是您允许用户通过表单上的选择框设置客户端。

然而,这带来了安全问题。想象一下,您只向特定用户展示了他可以从中选择的 3 个不同客户端(ID:1、2、3)。如果用户手动修改表单,他可以将 ID #4 的客户端分配给他的项目,这可能是一个安全问题,也可能只是一个错误。

要关闭安全问题,请向您的项目模型添加验证,以确保客户端 ID 有效。

于 2012-10-06T22:36:54.630 回答