2013-07-20 37 views
21

Tôi đang sử dụng như sau:Rails 4 thân Id Slug Không cập nhật

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

tôi đang tạo ra một phần Điều on Rails của tôi 4 trang web. Vấn đề tôi gặp phải là khi tôi thay đổi tên của bài viết hiện tại, sên không được cập nhật.

Đây là những gì tôi có cho đến nay:

extend FriendlyId 
friendly_id :name, use: :slugged 

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

Có thể thử phương thức này từ friendly_id 4 (-> Rails 3 compat. Phiên bản) http://rubydoc.info/github/FriendlyId/friendly_id/4.0-stable/file/Guide.rdoc#Deciding_When_to_Generate_New_Slugs –

+1

yeah chỉ cần thêm: def should_generate_new_friendly_id? đúng kết thúc – Brian

+0

vâng chắc chắn .. – Brian

Trả lời

49

Trong FriendlyId 4 (Rails 3 tương thích) đã có một phương pháp

should_generate_new_friendly_id? 

và bạn có thể xác định nó trên mô hình của bạn để kiểm soát khi sên được tạo lại. Hãy thử

def should_generate_new_friendly_id? 
    name_changed? 
end 

để tạo lại slug khi thay đổi tên.

CHỈNH SỬA

FriendlyId phiên bản 5 (tương thích Rails 4) không tạo lại sên lưu nữa. Để khôi phục chức năng này, bạn có thể đặt cột sên thành nil trước khi lưu hoặc sử dụng giải pháp được cung cấp ở trên.

EDIT 2

Bạn cần phải ghi đè setter sên cho tiết kiệm của bạn để làm việc cho Rails FriendlyId> 5 như được tham chiếu trong issue này.

Thêm phần này vào mô hình tập tin

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

là name_changed? một ví dụ ngẫu nhiên? hoặc chúng ta nên thêm '_changed?' cho mô hình? –

+7

@HarshaMV '[attribute] _changed?' Là một phương thức được tạo ra cho bạn bởi Rails. –

+1

pfff một cách trung thực, thậm chí đặt slug thành nil không hoạt động.Kể từ khi friendly_id đã cập nhật cho đường ray 3, phiên bản 5 vv ... nó chỉ được làm việc ngẫu nhiên. Có nghĩa là, * mega-random *. Quá tệ. – Ben

2

Tôi có vấn đề này và chỉ muốn chỉ ra những gì tôi đã nhận thấy.

nếu bạn chỉ làm như trong tài liệu

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

và sau đó chạy Post.find_each(&:save) - sên là gonna được cập nhật ...

Tuy nhiên, trong trường hợp của tôi, tôi cũng có những trong mô hình của tôi

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 

với mã ở trên nó sẽ không làm bất cứ điều gì khi bạn chạy Post.find_each(&:save) Tôi giả sử vì tiêu đề của bạn không thay đổi. (Phương pháp đầu tiên xử lý ngôn ngữ Nga)

vì vậy khi làm việc với mô hình đầu tiên tất cả đều hiệu quả, nhưng sau đó khi tôi sao chép mã sẵn sàng sang mô hình tiếp theo tôi muốn slugify, tôi gặp phải một số vấn đề. Hy vọng nó sẽ giúp ai đó.