12/08/2018, 13:22

Sử dụng Pretty URL với Friendly_id gem trong rails

Mở đầu Bắt đầu bài viết mình xin đưa ra một ví dụ với 2 url như sau. http://cafef.vn/vi-sao-gia-thep-tang-20160418150522257.chn và http://cafef.vn/20160418150522257.chn Như trên mọi người đều thấy sự khác biệt về mặt hiển thị của ví dụ trên. URL thứ nhất chúng được gọi là Pretty URL, ta ...

Mở đầu

Bắt đầu bài viết mình xin đưa ra một ví dụ với 2 url như sau.

http://cafef.vn/vi-sao-gia-thep-tang-20160418150522257.chn

http://cafef.vn/20160418150522257.chn

Như trên mọi người đều thấy sự khác biệt về mặt hiển thị của ví dụ trên.

URL thứ nhất chúng được gọi là Pretty URL, ta có thể tường minh được nội dung mà chúng ta sắp di chuyển đến còn với url thứ hai thì chỉ là một dãy số đơn điệu.

Tổng quát

Pretty URL là URL của một trang web, với nội dung mô tả ngắn gọn về trang mà chúng ta sẽ chuyển đến. Một URL tốt sẽ đóng một vai trò rất quan trọng trong việc SEO website. Với nhu cầu nhu vậy, một gem đã được tạo ra để hỗ trợ cho việc tạo ra các URL mô tả website. Trong bài viết này, mình xin được giới thiệu gem friendly_id

Cài đặt

Thêm vào gemfile và chạy bundle install

gem "friendly_id", "~> 5.1.0"

Tạo model Post.rb

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

Thêm column vào bảng Post trong database bằng lệnh

Chú ý: chỉ thêm vào bảng nào mà ta muốn pretty url đối với các url liên quan đến model tương ứng.

rails generate migration AddSlugToPosts slug:string

Sau đó chỉnh sửa thêm index cho migration file như sau

class AddSlugToPosts < ActiveRecord::Migration
  def change
    add_column :posts, :slug, :string
    add_index  :posts, :slug
  end
end

Chú ý: Ở đây có một lưu ý là để đảm bảo tính duy nhất nhất cho URL thì ta phải đặt index cho column slug.

Cuối cùng là chạy lệnh rake db:migrate

Cách sử dụng

Sau khi sử dụng gem và config như trên ta có thể sử dụng vào project như sau.

Như trước khi chưa sử dụng gem friendly_id thì cú pháp lấy ra một bản ghi Post bất kỳ là như sau.

@post = Post.find_by params[:id]

Còn sau khi sử dụng gem friendly_id

@post = Post.friendly.find_by params[:id]

  • Hoặc ta cũng có thể cấu hình như sau để giảm sự lặp lại code trong project.

Thêm option :finders vào Post model

friendly_id :title, use: [:slugged, :finders]

Sau khi thêm như trên thì lúc gọi ta sẽ lược bỏ được thành phần friendly như sau

#before add :finders
@post = Post.friendly.find_by params[:id]

#after add :finders
@post = Post.find_by params[:id]
  • Sử dụng với gem cancancan

Khi sử dụng với gem cancancan, việc tìm bản ghi vẫn là tìm theo id của bản ghi trong database, chúng ta cần config lại như sau.

load_and_authorize_resource find_by: :slug

Generate new slugs

Khi chúng ta tạo mới một post hoặc khi ta update lại trường title chúng ta cần override lại method _should_generate_new_friendly_id? như dưới đây.

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

  def should_generate_new_friendly_id?
    title_changed? || super
  end
end

Kết luận

SEO là một công việc đòi hỏi sự kết hợp, tương tác nhuần nhuyễn nhiều thủ thuật khác nhau. Và Pretty URL là một trong những kỹ thuật đó, hy vong bài viết giúp ích được cho công việc các bạn.

0