这个问题与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在引起此问题的方式中是否有些东西混合在一起?

我正在使用永久链接-V.1.0.0宝石 http://github.com/goncalossilva/permalink_fu

有帮助吗?

解决方案

在研究此之后,我现在可以看到该问题与永久链接验证它应该创建永久链接的方式有关。它通过检查类的永久链接field是否为空白来验证这一点。

什么是permalink_field?当你这样做的时候

class Parent < ActiveRecord::Base
  has_permalink :name
end

class Child < Parent
end

您可以通过写作访问永久链接 Parent.new.permalink 或者 Child.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的Metaclass:

class << self
  attr_accessor :permalink_field
end

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

问题是,尽管 permalink_field 方法 在所有子类上可用, 价值 存储在该班级中。这意味着该值不传播到子类。

所以,作为 permalink_field 存储在 Parent 班级,尽管孩子继承了访问者方法,但孩子没有继承该值。作为 Child.permalink_field 是空白的, should_create_permalink? 返回 false, , 和 Child.create :name => 'something' 不会创建永久链接。

一种可能的解决方案是用cattr_accessors在类上替换Metaclass上的attr_acessors(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 及其所有子类(和亚班级)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top