【问题标题】:Subclassing ActiveRecord with permalink_fu in a rails engine在 Rails 引擎中使用 permalink_fu 子类化 ActiveRecord
【发布时间】:2010-08-27 18:47:55
【问题描述】:

这个问题与在 Ruby 中扩展类方法有关,也许更具体地说是 permalink_fu 这样做的方式。

模型上的has_permalink 似乎在派生模型中不可用。当然,我希望类中定义的任何内容都被其派生类继承。

class MyScope::MyClass < ActiveRecord::Base
  unloadable
  self.abstract_class = true
  has_permalink :name
end

class MyClass < MyScope::MyClass
  unloadable
  #has_permalink :name # This seems to be required
end

permalink_fu 的混合方式是否会导致此问题?

我正在使用 permalink-v.1.0.0 gem http://github.com/goncalossilva/permalink_fu

【问题讨论】:

    标签: ruby-on-rails activerecord rails-engines permalink-fu


    【解决方案1】:

    经过调查,我现在可以看到问题与 permalink_fu 如何验证它是否应该创建永久链接有关。它通过检查类的 permalink_field 是否为空来验证这一点。

    什么是永久链接字段?当你这样做时

    class Parent < ActiveRecord::Base
      has_permalink :name
    end
    
    class Child < Parent
    end
    

    您可以通过写Parent.new.permalinkChild.new.permalink 访问永久链接。这个方法名可以通过写来改变

    class Parent < ActiveRecord::Base
      has_permalink :name 'custom_permalink_name'
    end
    

    如果是这样,可以通过写Parent.new.custom_permalink_name(或Child.new.custom_permalink_name)访问永久链接。

    这有什么问题? permalink_field 访问器方法在Parent 的元类上定义:

    class << self
      attr_accessor :permalink_field
    end
    

    当你运行 has_permalink 方法时,它会调用Parent.permalink_field = 'permalink'

    问题在于,虽然permalink_field 方法 在所有子类中都可用,但它的 存储在它被调用的类中。这意味着该值不会传播到子类。

    因此,由于 permalink_field 存储在 Parent 类中,因此 Child 不会继承该值,尽管它继承了访问器方法。由于Child.permalink_field 为空白,should_create_permalink? 返回false,而Child.create :name =&gt; 'something' 不会创建永久链接。

    一种可能的解决方案是将元类上的 attr_accessors 替换为类上的 cattr_accessors(permalink_fu.rb 文件的第 57 到 61 行)。

    替换

    class << base
      attr_accessor :permalink_options
      attr_accessor :permalink_attributes
      attr_accessor :permalink_field
    end
    

    base.cattr_accessor :permalink_options
    base.cattr_accessor :permalink_attributes
    base.cattr_accessor :permalink_field
    

    请注意,这将使对子类的任何可能的自定义无效。您将无法再为子类指定不同的选项,因为这三个属性由 Parent 及其所有子类(和子子类)共享。

    【讨论】:

    • 感谢您的帮助,这绝对让我开始着手修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多