gpt4 book ai didi

ruby-on-rails - Rails 验证中作为局部变量的属性与实例变量

转载 作者:行者123 更新时间:2023-12-04 06:15:06 24 4
gpt4 key购买 nike

在自定义验证方法中,为什么属性作为局部变量传递而不是作为实例变量访问?

我希望在下面的自定义验证中使用 @title 而不是 title,但是 @titlenil 在下面的代码中。 title 包含实际数据。

    attr_accessible :title
validate :do_check_title

def do_check_title
title =~ /^Alice in/ || errors.add(:title, "Not Alice in Wonderland")
end

查看active_record/core.rb

   def initialize(attributes = nil)
...
assign_attributes(attributes) if attributes
...
end

然后在active_record/attribute_assignment.rb

   def _assign_attribute(k, v)
public_send("#{k}=", v)

所以我猜,这些属性应该在验证函数中作为实例变量可用。

为什么它们是nil

最佳答案

如果您从验证或其他实例方法访问这些并不重要。你可以从控制台看到发生了什么( pry ):

u = User.first
show-method u.first_name=

这给你这样的东西:

generated_attribute_methods.module_eval("def #{attr_name}=(new_value); write_attribute('#{attr_name}', new_value); end", __FILE__, __LINE__)

现在,如果您查看 write_attribute 方法,您会发现它删除了属性缓存等,然后分配给 attributes,它只是一个散列。

u.attributes

所以从现在开始,您可以使用这个代替无聊的u.first_name = "foo":

u.send :write_attribute, "first_name", "foo"

它会做同样的事情 (3.2.10)。

关于ruby-on-rails - Rails 验证中作为局部变量的属性与实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14234883/

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