我需要创建一个允许创建和更新项目的 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