【问题标题】:Add public variable in Rails Model?在 Rails 模型中添加公共变量?
【发布时间】:2012-05-03 05:43:49
【问题描述】:

我正在尝试将手动创建的变量传递给我在 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 的代码移动到我的控制器中,但这会破坏我将其放入模型中的目的,因此我可以让它在保存时自动执行。

【问题讨论】:

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


    【解决方案1】:

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

    attr_accessor :corrective_change 
    attr_accessible :corrective_change 
    

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

    第二行attr_accessible 允许您通过mass assignment 设置此变量。基本上,如果您在控制器中执行类似操作时没有此行:

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

    如果params[:ncpar] 中有:corrective_change,则出于安全原因,它将被忽略,除非您明确声明要允许通过批量赋值来设置该变量:

    attr_accessible :corrective_change 
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 你能给我详细的吗?我的 ActiveRecord 类没有 protected 修饰符
      • 该死的太容易了,嗯。我会继续考虑的……对不起。
      • 好的^^。我还在试图弄清楚。显然,添加attr_accessor :corrective_change 后跟attr_accessible :corrective_change 似乎可以解决问题,但我仍在检查它是否真的传递给模型。
      【解决方案3】:

      显然,添加

      attr_accessor :corrective_change 
      attr_accessible :corrective_change 
      

      似乎解决了这个问题。

      我认为attr_accessor 创建getter 和setter 的根本问题,但是是私有的。但是,attr_accessible 使该值可以公开访问。

      【讨论】:

        猜你喜欢
        • 2017-05-20
        • 1970-01-01
        • 2011-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-20
        • 1970-01-01
        • 2020-05-30
        相关资源
        最近更新 更多