これを調査した後、問題は、permalink_fuがパーマリンクを作成する必要があるかどうかを確認する方法に関連していることがわかりました。クラスのpermalink_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
のメタクラスで定義されています。
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'
リンクを作成しません。
考えられる解決策は、メタクラスのattr_acessorsをクラスの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
これらの3つの属性は、およびそのすべてのサブクラス(およびサブサブクラス)によって共有されるため、サブクラスに異なるオプションを指定することはできなくなります。