在我的模型中,我有一些这样的验证:
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
?感谢
答案 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,因此在这种情况下不会忽略验证程序。