ruby-on-rails - 在 activerecord 模型中重新定义 *_before_type_cast 有什么影响

标签 ruby-on-rails ruby forms

假设我想在模型中重新定义一个方法:

class Model < ActiveRecord::Base
  attr_accesor :model_attr

  def model_attr
    'redefined'
  end
end

当我直接访问它时,它按预期工作,但是当我从 View 中调用它时:

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的描述中找到:

Added use of *_before_type_cast for all input and text fields. This is helpful for getting "100,000" back on a integer-based + validation where the value would normally be "100".

关于ruby-on-rails - 在 activerecord 模型中重新定义 *_before_type_cast 有什么影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20409650/

相关文章:

python - Firefox 中的 python cgi 问题

forms - Angular2 ngForm 不工作

ruby-on-rails - rails : During asset precompile throws error key must be 16 bytes

ruby-on-rails - Ruby on Rails 路由别名

ruby - Proc.new 如何找到这段代码中的 block ?

Ruby Hash.new 带 block 需要深入解释

jquery - Dajaxice 表单验证 : "unicode object has no attribute get" (jquery serialize)

ruby-on-rails - Ruby on Rails 中后台作业、rake 任务和 cronjobs 之间的区别?

ruby-on-rails - NodeJS 和 ORM?

ruby - 来自 EventMachine 的多个异步回调 - 有更好的方法来处理它吗?