attr_accessor在模型中空洞

时间:2012-06-16 12:39:27

标签: ruby-on-rails

我有一个表单,其中的字段不会永久存在于模型上,因此我在模型上使用attr_accessor使其可供使用,但是当我尝试访问它时,它总是返回nil。

表单字段:

<%= text_field_tag :discount_code, nil, maxlength: "12", class: "span2" %>

控制器:

def an_action
   @job = Job.find(session[:job_id])
   @job.some_method
end

模特:

class Job < ActiveRecord::Base
    attr_accessor :discount_code

    def some_method
        if !self.discount_code.blank?
        do some logic
    end
end

以上语句永远不会执行,因为它总是评估为nil。

该字段的值在控制器中可用作param w / out问题:

discount_code: test50
action: process_payment
controller: jobs

任何指针都会受到赞赏。

3 个答案:

答案 0 :(得分:1)

实际上,可以将相应的表单值自动设置为该类的实例。但你使用了text_field_tag,它设置了params [:discount_tag],当你需要的是一个参数[:job] [:discount_tag]

为此,您可以使用:

<%= f.text_field :discount_code, maxlength: 12, class: "span2" %>

这确实更优雅。

答案 1 :(得分:0)

如果您发布的示例代码确实是您模型中的内容,则问题只是您尝试访问discount_code的上下文。 discount_code值仅可用于模型的实例,但在您的情况下,您尝试在类上下文中访问它。

您可以覆盖setter方法以确认它实际上已设置:

def discount_code=(code)
  # If you get here, then the value is being set!
  super
end

答案 2 :(得分:0)

我明白了。我天真地认为attr_accesor会将相应的表单值自动设置为类的实例,因为Rails会使用实际的数据库字段(即form_for(@jobs)。

我只需要在控制器中添加以下内容:

@job.discount_code = params[:discount_code]

感谢您让我走上正轨。