2013-07-20 11 views
21

Używam następujący:Szyny 4 friendly Id Slug nie aktualizowanie

gem 'friendly_id', github: 'FriendlyId/friendly_id', branch: 'master' 

tworzę sekcję artykuł na moim Rails 4 witrynie. Problem polega na tym, że kiedy zmieniam nazwę istniejącego artykułu, ślimak nie jest aktualizowany.

To, co mam tak daleko:

extend FriendlyId 
friendly_id :name, use: :slugged 

add_column :articles, :slug, :string 
add_index :articles, :slug, unique: true 
+1

Może wypróbować tę metodę od friendly_id 4 (-> Szyny 3 compat wersja). Http://rubydoc.info/github/FriendlyId/friendly_id/4.0-stable/file/Guide.rdoc#Deciding_When_to_Generate_New_Slugs –

+1

tak, że pracowali przez tylko dodanie: def should_generate_new_friendly_id? true koniec – Brian

+0

tak na pewno .. – Brian

Odpowiedz

49

W FriendlyId 4 (Rails 3 compatible) istniała metoda

should_generate_new_friendly_id? 

i można określić go na modelu, aby kontrolować, kiedy ślimak jest regenerowany. Spróbuj

def should_generate_new_friendly_id? 
    name_changed? 
end 

do regeneracji ślimak podczas zmiany nazwy.

EDIT

FriendlyId wersja 5 (kompatybilny Szyny 4) nie regeneruje ślimaki na już uratować. Aby przywrócić tę funkcjonalność, przed zapisaniem lub skorzystaj z powyższego rozwiązania, możesz ustawić kolumnę ze ślimakami na nil.

EDIT 2

Trzeba zastąpić setter ślimak na swój oszczędza pracować Rails FriendlyId> 5 wymieniony w tym issue.

Dodaj do tego pliku modelu

def slug=(value) 
    if value.present? 
     write_attribute(:slug, value) 
    end 
    end 
+0

was name_changed? losowy przykład? czy powinniśmy dodać "_zmienione?" dla modelu? –

+7

@HarshaMV '[atrybut] _zmieniony?' Jest metodą generowaną przez Rails. –

+1

pfff szczerze mówiąc, nawet ustawienie limitu do zera nie działa.Ponieważ friendly_id został zaktualizowany dla rails 3, wersji 5 itd. ... po prostu działał losowo. Znaczenie, * mega-losowo *. Szkoda. – Ben

2

mam tej kwestii i po prostu chcą podkreślić to, co zauważyłem.

jeśli tylko zrobić jak w Dokumentach

class Post < ActiveRecord::Base 
extend FriendlyId 
friendly_id :title, use: :slugged 
end 

a następnie uruchomić Post.find_each(&:save) - ślimak jest gonna get aktualizowany ...

Jednak w moim przypadku, ja też mam to w moim modelu

class Post < ActiveRecord::Base 
extend FriendlyId 
friendly_id :title, use: :slugged 

def normalize_friendly_id(text) 
    text.to_slug.normalize(transliterations: :russian).to_s 
end 

def should_generate_new_friendly_id? 
    title_changed? 
end 
end 

z powyższym kodem nic nie zrobi po uruchomieniu Post.find_each(&:save) Zakładam, że Twój tytuł się nie zmienia. (pierwsza metoda obsługuje język rosyjski)

, więc podczas pracy z pierwszym modelem wszystko działało świetnie, ale kiedy skopiowałem gotowy kod do następnego modelu, który chciałem spowolnić, napotykam na pewne problemy. Mam nadzieję, że to komuś pomaga.