在setter方法中设置字段

时间:2014-11-02 12:38:24

标签: ruby-on-rails ruby

在我的模型中,我有一些这样的验证:

validates :text, presence: true, unless: :skip_fehler

我为我的控制器中的特定实例设置了skip_fehler

@user.create(skip_fehler: params['skip_fehler'], text: .. 

基本上我的代码在我的模型中有效:

attr_accessor :skip_fehler

我注意到的唯一问题是当@user.skip_fehler设置为""时,也会跳过验证。

我想避免这种行为所以我试图将accessor更改为reader

  attr_reader :skip_fehler

我写了自己的setter方法:

  def skip_fehler=(value)
    if value && value != "" 
      self.skip_fehler = true
    else
      self.skip_fehler = false
    end
  end

但是现在,我得到了错误stack level too deep

我想因为在skip_fehler=(value)内我打电话给self.skip_fehler = true

我如何更改代码?那么当控制器中skip_fehler设置为""时,它在模型中设置为false?感谢

3 个答案:

答案 0 :(得分:1)

你可以写:

attr_reader :skip_fehler

def skip_fehler=(value)
  @skip_fehler = value.present?
end

这项工作,因为attr_reader :skip_fehler是以下的快捷方式:

def skip_fehler
  @skip_fehler
end

value.present?!value.nil? && value != ""

相同

答案 1 :(得分:0)

尝试使用write_attribute而不是分配。这样,值就会直接写入属性的内部表示。

write_attribute(:skip_fehler, value)

答案 2 :(得分:0)

Rails验证器接受Procs:if和:unless参数。 这意味着你可以像这样声明你的验证器:

validates :text, 
    presence: true, 
    unless: Proc.new { |model| model.skip_fehler.present? }

验证员将使用您的模型调用您的proc。当下?对于空字符串返回false,因此在这种情况下不会忽略验证程序。