假设我想重新定义模型中的方法:
class Model < ActiveRecord::Base
attr_accesor :model_attr
def model_attr
'redefined'
end
end
当我直接访问它时,它按预期工作,但当我从视图调用它时:
f.text_field :model_attr
没有。但这仍然有效:
f.text_field :model_attr, value: @model.model_attr
所以我不得不深入研究Rails代码:
def text_field(object_name, method, options = {})
Tags::TextField.new(object_name, method, self, options).render
end
到
class TextField < Base # :nodoc:
def render
options = @options.stringify_keys
options["size"] = options["maxlength"] unless options.key?("size")
options["type"] ||= field_type
options["value"] = options.fetch("value") { value_before_type_cast(object) } unless field_type == "file"
options["value"] &&= ERB::Util.html_escape(options["value"])
add_default_name_and_id(options)
tag("input", options)
end
和
def value_before_type_cast(object)
unless object.nil?
method_before_type_cast = @method_name + "_before_type_cast"
object.respond_to?(method_before_type_cast) ?
object.send(method_before_type_cast) :
value(object)
end
end
好吧,看来
text_field
不是直接访问属性,而是附加_before_type_cast
。我已经read the documentation,但仍然不明白为什么这对#text_field
是必要的?我能做到,而且很管用:class Model < ActiveRecord::Base
attr_accesor :model_atr
def model_attr
'redefined'
end
def model_attr_before_type_cast
model_attr
end
end
如果我重新定义这两种方法,我将来会不会遇到麻烦?有更好的办法吗?
最佳答案
使用*_before_type_cast
的原因可以在commit的描述中找到:
为所有输入和文本字段添加了在类型转换之前使用*\u。这有助于基于整数的“100000”返回
+值通常为“100”的验证。
关于ruby-on-rails - 在ActiveRecord模型中重新定义* _before_type_cast有什么含义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20409650/