2

我刚刚开始接触 Rails 中的关注点,并尝试为 ActiveRecord 类实现简单的日志记录。在那里我想定义应该进入日志并在保存后自动写入日志的字段。

我所拥有的是:

#logable.rb (the concern)
module Logable
  extend ActiveSupport::Concern

  @field = nil
  module ClassMethods
    def set_log_field(field)
      @feild = field
    end
  end

  def print_log
    p "LOGGING: #{self[@index.to_s]}"
  end
end


#houses.rb (the model using the concern)
class House < ActiveRecord::Base
  include Logable
  after_save :print_log
  set_log_field :id
end

不幸的是,对 set_log_field 的调用没有效果——或者更确切地说,给定的值没有进入 print_log。我究竟做错了什么?

谢谢你的帮助!

4

1 回答 1

0

你可能是这个意思(顺便说一句,为什么不Loggable呢?):

# logable.rb
module Logable
  extend ActiveSupport::Concern

  # Here we define class-level methods.
  # Note, that @field, defined here cannot be referenced as @field from
  # instance (it's class level!).
  # Note also, in Ruby there is no need to declare @field in the body of a class/module.
  class_methods do
    def set_log_field(field)
      @field = field
    end

    def log_field
      @field
    end
  end

  # Here we define instance methods.
  # In order to access class level method (log_field), we use self.class.
  included do
    def print_log
      p "LOGGING: #{self.class.log_field}"
    end
  end
end

更新included您还询问了块中的方法和方法主体中的方法有什么区别。

做一份简短的简历似乎没有什么区别。您可以非常近似地认为它们是相同的。唯一的细微差别在于依赖管理。ActiveSupport::Concern文档的末尾给出了很好的说明。值得一读,看看!

于 2015-09-08T21:07:13.533 回答