0

我有一个表单,其字段不会永久存在于模型上,因此我在模型上使用 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

上面的语句永远不会执行,因为它总是评估为零。

该字段的值在控制器中作为参数提供,没有问题:

discount_code: test50
action: process_payment
controller: jobs

任何指针将不胜感激。

4

3 回答 3

1

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

为此,您可以使用:

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

这确实更优雅。

于 2012-06-16T14:01:37.980 回答
0

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

您可以覆盖 setter 方法以确认它确实被设置:

def discount_code=(code)
  # If you get here, then the value is being set!
  super
end
于 2012-06-16T12:50:38.683 回答
0

我想到了。我天真地认为 attr_accesor 会自动将相应的表单值设置为类的实例,就像 Rails 对实际数据库字段所做的那样(即 form_for(@jobs)。

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

@job.discount_code = params[:discount_code]

谢谢你让我走上正轨。

于 2012-06-16T13:52:08.510 回答