1

この質問は、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.0gemhttp://github.com/goncalossilva/permalink_fuを使用しています

4

1 に答える 1

0

これを調査した後、問題は、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つの属性は、およびそのすべてのサブクラス(およびサブサブクラス)によって共有されるため、サブクラスに異なるオプションを指定することはできなくなります。

于 2010-09-01T06:14:00.340 に答える