2010-08-27 48 views
1

此問題與在Ruby中擴展類方法有關,也許更具體地說,與permalink_fu的方式相關。在rails引擎中使用permalink_fu對ActiveRecord進行子類化

看來模型上的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

回答

0

調查之後,我現在可以看到,這個問題是關係到permalink_fu如何驗證它,它應該創建一個固定鏈接或沒有。它通過檢查類的permalink_field是否爲空來驗證這一點。

什麼是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 => 'something'不會創建永久鏈接。

一個可能的解決方案是用class上的cattr_accessors替換元類上的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及其所有子類(和子類)共享。

+0

感謝您的幫助,它絕對讓我開始修復。 – aceofspades 2010-09-07 16:23:57