gpt4 book ai didi

ruby-on-rails - 如何为初始化变量创建验证?

转载 作者:数据小太阳 更新时间:2023-10-29 08:24:18 25 4
gpt4 key购买 nike

我有一个变量 value,它在我创建新对象时被初始化。但是,这个变量不是我表中的一列。我只想在我的模型中使用它,并让它可用于我类中的某些方法:

class MyClass < ActiveRecord::Base
def initialize (value)
@value = value
end
end

因此,当创建一个新对象时,@value 将暂时保留一些文本,例如:

test = MyClass.new("some text")

有一种方法可以验证变量 value 只接受文本吗?

class MyClass < ActiveRecord::Base
validates_format_of :value => /^\w+$/ # it doesn't work

def initialize (value)
@value = value
end
end

编辑

我已经尝试了所有的答案,但我的 Rspec 仍然通过:

我的新类(class):

class MyClass < ActiveRecord::Base
validate :check_value

def check_value
errors.add(:base,"value is wrong") and return false if !@value || !@value.match(/^\w+$/)
end

def initialize (value)
@value = value
end

def mymethod
@value
end
end

我的 Rspec(我原以为它会失败,但它仍然通过):

describe MyClass do
it 'checking the value' do
@test = MyClass.new('1111').mymethod
@test.should == '1111'
end
end

我想在将 1111 分配给 @value 之前引发验证错误。

最佳答案

只有当您在模型上调用 valid?save 时,Rails 才会进行验证。因此,如果您希望它在调用这些方法时只接受您的值,请执行自定义验证:

class MyClass < ActiveRecord::Base

validate :value_string

#further code

在 protected 范围内设置您的值验证

protected

def value_string
self.errors[:base] << 'Please assign a string to value' unless @value.match(/^\w+$/)
end

如果不调用 valid?save,就不会调用这些验证,就像我之前说的那样。如果您希望在任何时候都不要将值分配给类似单词的值以外的其他值,那么除了在初始化时阻止它之外别无他法:

def initialize(attributes = nil, options = {})
attr_value = attributes.delete(:value) if attributes
@value = attr_value if attr_value && attr_value.match(/^\w+$/)

super
end

编辑

我不建议在初始化时分配不接受的值时引发 ActiveRecord 验证错误。尝试根据 ArgumentError 提出您自己的自定义错误

课外

YourError = Class.new(ArgumentError)

在你的类(class)里

def initialize(attributes = nil, options = {})
attr_value = attributes.delete(:value) if attributes
if attr_value && attr_value.match(/^\w+$/)
@value = attr_value
elsif attr_value
raise YourError.new('Value only accepts words')
end

super
end

然后这样测试

describe Myclass do
it 'should raise an error if value is assigned with something else than a word' do
lambda{ MyClass.new(:value => 1111)}.should raise_error(YourError)
end
it 'should assign the value for words' do
MyClass.new(:value => 'word').value.should == 'word'
end
end

关于ruby-on-rails - 如何为初始化变量创建验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11542884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com