調查之後,我現在可以看到,這個問題是關係到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不會繼承該值。由於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
及其所有子類(和子類)共享。
感謝您的幫助,它絕對讓我開始修復。 – aceofspades 2010-09-07 16:23:57