Tạo đường dẫn thân thiện (friendly url) trong rails 4
This post hasn't been updated for 8 years
Chắc các bạn đã biết về SEO websites, và một trong nhiều cách thức đó là làm cho đường dẫn trở lên thân thiện (friendly url). Ví dụ như trong hai đường dẫn sau đây:
http://www.example.com/posts/1
và
http://www.example.com/posts/1-this-is-the-first-tutorial
Thì đương nhiên chúng ta thấy đường dẫn thứ hai là thân thiện với các công cụ tìm kiếm hơn. Tức là người dùng có thể dễ dàng tìm kiếm thấy bài viết có đường dẫn định dạng như thứ hai hơn là thứ nhất. Trong bài viết này mình xin được viết về chủ đề này, tuy rằng nó không mới và cũng không khó nhưng mình nghĩ rằng là cần thiết cho một website.
Nguồn tham khảo
Rails 4
Triển khai
Ví dụ chúng ta có một model là Post
để viết bài, bảng posts
gồm 2 trường chính là title
và content
chẳng hạn.
Chúng ta dùng trường title
làm tiêu đề bài viết cũng như sẽ dùng trường này làm đường dẫn thân thiện như ví dụ phía trên.
Thêm vào gemfile
Thêm vào Gemfile
dòng sau và bundle install
gem 'stringex', '~> 2.5.2'
Gem trên sẽ giups ta convert 1 chuỗi sang dạng như trên url ở ví dụ trên.
Ví dụ:
Ta có 1 bài viết với tiêu đề là: This is the first tutorial
Gem trên sẽ convert về dạng: this-is-the-first-tutorial
Tạo model
Sử dụng scaffold
trong rails để tạo, đơn gianr và nhanh chóng tự động sinh mã cho chúng ta.
rails g scaffold post title:string content:text
Tiếp theo chúng ta thêm vào bảng posts
cột tên là slug
để lưu chuỗi mà convert được như ở trên vào database.
rails g migration AddSlugToPosts slug:string
Migrate database.
rake db:migrate
Viết phương thức
Thêm vào model Post
như sau:
acts_as_url :title, url_attribute: :slug, sync: true
def to_param
"#{id}-#{slug}"
end
Kiểm tra trên console
rails c
c = Post.create title: "This is test post."
c.save
c.slug
=> "this-is-test-post"
Cải tiến
Như phía trên chúng ta đã triển khai được để có được đường dẫn thân thiện với các công cụ tìm kiếm. Tuy nhiên ví dụ trên là áp dụng chỉ cho một model là Post
. Vậy nếu chúng ta áp dụng cho nhiều model thì sao? Khi đó model nào cũng viết như trên với phương thức to_param
trên thì sẽ thấy trùng lặp nhiều và khó kiểm soát.
Vậy để tránh điều đó chúng ta sẽ đưa những cái có thể dùng chung vào 1 module
như sau:
Tạo module sluggable.rb
models/concerns/sluggable.rb
module Sluggable
extend ActiveSupport::Concern
included do
acts_as_url :title, url_attribute: :slug, sync: true
end
def to_param
"#{id}-#{slug}"
end
end
Và với mỗi model khi cần dùng tới thì chúng ta chỉ cần include
module này vào là xong.
Như ví dụ trên với model Post
thì như sau:
class Post < ActiveRecord::Base
include Sluggable
end
Vậy là xong, chúng ta đã tạo xong 1 chức năng gọi là friendly url
. Đây là cách đơn gianr để thực hiện điều này. Cảm ơn các bạn đã xem bài viết.
All Rights Reserved