2013-09-28 49 views
9

Tôi đang sử dụng friendly_id 5.0.0.rc1 và cũng active_admin.friendly_id slug không thay đổi khi cập nhật

Nó sẽ xuất hiện tất cả mọi thứ đang làm việc một cách hoàn hảo như mong đợi, ngoại trừ một thực tế rằng việc cập nhật slug thuộc tính/cột của một kỷ lục trong active_admin không làm gì cả (nó giữ nó giống nhau)

tôi thấy hành vi tương tự chỉ sử dụng console:

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

cấu hình của tôi:

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 

mô hình của tôi:

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 

điều khiển của tôi:

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 

Cảm ơn!

+0

Có lẽ tôi đang nghĩ một cách sai lầm, nhưng cấu hình của bạn nói rằng nó sẽ tạo ra một sên mới khi cột sên thay đổi. Vì vậy, nếu bạn thay đổi giá trị của cột slug theo cách thủ công và bạn lưu bản ghi, tôi giả định rằng quá trình tạo sẽ được kích hoạt dẫn đến slug cũ vì tiêu đề không thay đổi !? – Vapire

+1

Để trả lời câu hỏi của bạn: nó không kích hoạt. Và theo mặc định, họ giải thích ngược lại. Vì vậy, bạn cần phải có def của bạn should_generate_new_friendly_id? trong mọi mô hình. – Ben

Trả lời

22

Thông thường khi sử dụng id thân thiện, bạn không bao giờ cập nhật slug theo cách thủ công. Thay vào đó:

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

Và sau đó mỗi khi bạn thay đổi tiêu đề, nó sẽ tự động cập nhật sên.

+1

Phần config.use Module.new {} nằm trong tệp cấu hình (rõ ràng sẽ ngăn bạn lặp lại phương thức should_generate_new_friendly_id trong mọi mô hình) chỉ đơn giản là bị bỏ qua. Rất sai lạc vì nó được giải thích rõ ở phần cuối của tập tin cấu hình mặc định – Ben

+0

@Ben vui lòng chỉnh sửa,> 1yr cũ – AJcodez

+0

Thứ gì đó tôi không nhận được ngay tại đây ... Có gì cập nhật lúc này? Tôi muốn biết. Nó vẫn được giải thích như thế này trong tập tin cấu hình mặc định của họ – Ben

1

chính xác hơn, bạn nên sử dụng self.title_changed?

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

'self' là cần thiết khi chúng ta sử dụng nó cho' setter' và cho 'getter' chúng ta có thể sử dụng nó với/không có' self' –

Các vấn đề liên quan