我有一个表单,其中的字段不会永久存在于模型上,因此我在模型上使用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
任何指针都会受到赞赏。
答案 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]
感谢您让我走上正轨。