2011-05-13 68 views
4

我有两个模型类,患者和处方,用belongs_to的关系:的Rails 3:形式传递belongs_to的领域,不能大规模指派保护属性

class Prescription 
    belongs_to :patient 
    ... 

我有创造新处方形式对象,我希望它得到一个隐藏字段病人:

<%= form_for(@prescription) do |f| %> 
... 
    <%= f.hidden_field :patient_id, :value => @patient.id %> 
... 

在处方控制器我要创建使用我从形式得到了PARAMS新的处方:

def create 
    @prescription = Prescription.new(params[:prescription]) 
    ... 

有些东西不起作用。我可以将日志病人ID在PARAMS传递中所看到的,但它是没有得到插入到数据库:

 
    Started POST "/prescriptions" for 127.0.0.1 at 2011-05-13 14:59:00 +0200 
    Processing by PrescriptionsController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"h3rizbBoW069EfvQf6NyzH53k+g4o4XO61jeZ/GF6t0=", "prescription"=>{"medicine_name"=>"w", "dispense_date(1i)"=>"2011", "dispense_date(2i)"=>"5", "dispense_date(3i)"=>"13", "days_supply"=>"2", "patient_id"=>"1"}, "commit"=>"Create Prescription"} 
WARNING: Can't mass-assign protected attributes: patient_id 
    Patient Load (0.2ms) SELECT "patients".* FROM "patients" WHERE "patients"."id" IS NULL LIMIT 1 
    AREL (0.4ms) INSERT INTO "prescriptions" ("medicine_name", "dispense_date", "days_supply", "patient_id", "created_at", "updated_at") VALUES ('w', '2011-05-13', 2, NULL, '2011-05-13 12:59:00.690434', '2011-05-13 12:59:00.690434') 

什么是对大众指派保护属性的警告信息是什么意思?我该如何更改代码才能使用?

回答

7

“无法大规模分配”是指你不能这样自动分配一个值:

# In the examples below @prescription.patient_id will not be set/updated 
@prescription = Prescription.new(params[:prescription]) 
@prescription.update_attributes(params[:prescription]) 

您可以通过在你的Prescription模型设定:patient_idattr_accessible解决这个问题。如果你这样做,请确保你了解security risks

attr_accessible :patient_id 

或者通过向patient_id直接分配一个值:

@prescription.patient_id = some_value 
13

我想你已经错过了大约导轨将要在这种情况下真正帮助伟大的事情之一。这就是在路由中嵌套资源的可能性。

例如,如果你的routes.rb看起来是这样的:

resources :patients do 
    resources :prescriptions 
end 

这将导致该网址为您的控制器看起来像/patients/:patient_id/prescriptions/和的结果是,由于patient_id已经是在现有的url,你不必有任何隐藏的表单来存储它。因此,在您PrescriptionsController,创建操作看起来是这样的:

def create 
    @patient = Patient.find(params[:patient_id]) 
    @prescription = @patient.prescriptions.build(params[:prescription]) 

当您使用联想到“建设”的实例,而不是直接与模型,它会自动分配patient_id你。

这可能不是您的问题的确切答案,但这可能是我会这样做的方式。

1

我没有把足够的代码片段放在上面。原来,在我的模型的问题是由于这样的:

class Prescription: 
    belongs_to :patient 
    attr_accessible :medicine_name, :dispense_date, :days_supply 

所以我没有耐心attr_accessible的名单上,这导致了错误信息。我真的不明白attr_accessible是需要什么的,如果我删除它,一切工作。

谢谢你的意见,尤其是关于嵌套资源的意见,我会研究一下。

+0

阅读有关批量分配漏洞的信息:http://guides.rubyonrails.org/security.html – 2013-05-01 06:46:48

相关问题