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à ...
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 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
1 2 3 4 5 6 |
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
1 2 3 4 5 6 7 8 |
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
1 2 3 4 5 6 7 |
#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_friendlyid? như dưới đây.
1 2 3 4 5 6 7 8 9 10 |
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.