在Rails模型中添加公共变量?

时间:2012-05-03 05:43:50

标签: ruby-on-rails ruby database ruby-on-rails-3 activerecord

我正在尝试将手动创建的变量传递给我在Rails中的模型。

例如,我有一个这样的表格:

<%= form_for(@ncpar) do |f| %>
    <%= f.check_box(:corrective_change) %> Change Corrective Action?
    <%= f.text_area :corrective_desc %>
    <%= f.submit %>
<% end %>

在我的数据库中,没有corrective_change列。它的目的是在我的模型中使用手动功能,这意味着它不会保存在数据库中。

在我的模型中,我提出了这个:

attr_accessor :corrective_change 
#Cause: Can't mass-assign protected attributes: corrective_change

我也试试:

attr_accessible :corrective_change
#Cause: unknown attribute: corrective_change

那么将这个变量传递给我的模型并访问它的方法应该是什么?

PS:我可以将使用corrective_change的代码移动到我的控制器中,但这会破坏我将其放入模型中的目的,这样我就可以在保存时自动执行它。

3 个答案:

答案 0 :(得分:2)

简短的回答是你可能需要两者:

attr_accessor :corrective_change 
attr_accessible :corrective_change 

这两行做不同的事情,第一行attr_accessor使用getter和setter在模型上创建一个公共属性。

第二行attr_accessible允许您通过mass assignment设置此变量。基本上如果你在控制器中做了类似的事情,你就没有这条线:

@ncpar = NCpar.new(params[:ncpar])

如果:corrective_change中有params[:ncpar],则出于安全原因会忽略它,除非您明确声明要允许通过质量分配设置该变量:

attr_accessible :corrective_change 

答案 1 :(得分:0)

attr_accessor就是你想要的。你只是不希望它受到保护。尝试将attr_accessor指令移到模型中的protected行上方。

答案 2 :(得分:0)

显然,添加

attr_accessor :corrective_change 
attr_accessible :corrective_change 

似乎可以解决问题。

潜在问题我认为attr_accessor创建getter和setter,但是私有。但是,attr_accessible会使该值公开访问。