2013-09-28 80 views
9

我正在使用friendly_id 5.0.0.rc1和active_adminfriendly_id slu not不會更新

如預期,除了事實active_admin更新記錄的slug屬性/列並不做任何事情這樣看來,一切都可以正常使用(它保持它相同)

我發現同樣的行爲只使用控制檯:

p = Post.first 
p.slug 
#=> 'test' 
p.slug = 'another-test' 
p.save 
#=> true 
p.slug 
#=> 'test 

我的配置:

FriendlyId.defaults do |config| 
    config.use :reserved 

    config.reserved_words = %w(admin new edit index session users register) 

    config.use :finders 

    config.use :slugged 

    config.slug_column = 'slug' 

    config.sequence_separator = '-' 

    config.use Module.new { 
    def should_generate_new_friendly_id? 
     slug.blank? || slug_changed? 
    end 
    } 
end 

我的模型:

class Post < ActiveRecord::Base 

    default_scope { order('created_at DESC') } 

    validates :title, presence: true 
    validates :body, presence: true 
    validates :views, presence: true, numericality: { only_integer: true } 

    extend FriendlyId 
    friendly_id :title, use: [:slugged, :history] 

end 

我的控制器:

class PostsController < ApplicationController 

    def index 
    @posts = Post.all.page(params[:page]).per(10) 
    end 

    def show 
    @post = Post.find_by_slug!(params[:id]) 

    if request.path != post_path(@post) 
     redirect_to @post, :status => :moved_permanently and return 
    else 
     @post.increment :views if @post 
    end 

    end 

end 

謝謝!

+0

也許我想錯了,但是您的配置狀態,當slug列改變了它應該產生一個新的團狀。所以如果你手動修改slug列的值,並保存記錄,我會假設生成過程被觸發,這會導致舊的slug,因爲標題沒有改變!? – Vapire

+1

要回答你的問題:它不會觸發。默認情況下,他們解釋相反。所以你需要有你的def should_generate_new_friendly_id?在每個模型中。 – Ben

回答

22

通常當使用友好的id時,你永遠不會手動更新slug。相反:

def should_generate_new_friendly_id? 
    slug.blank? || title_changed? 
end 

然後每次更改標題的時候,它會自動更新蛞蝓。

+1

位於配置文件中的config.use Module.new部分(顯然會阻止您在每個模型中重複should_generate_new_friendly_id方法)僅被忽略。非常具有誤導性,因爲在默認配置文件末尾已經很好地解釋了它 – Ben

+0

@Ben請編輯,其> 1yr old – AJcodez

+0

我不明白的地方......那麼現在是什麼時候呢?我想知道。如果你不喜歡這個答案,編輯它,它仍然在他們的默認配置文件 – Ben

1

更確切地說,你應該使用self.title_changed?

def should_generate_new_friendly_id? 
    slug.blank? || self.title_changed? 
end 
+0

當我們將'self'用於'setter'和'getter'時,我們可以在有/無'self'的情況下使用'self' –