Tạo đường dẫn thân thiện (friendly url) trong rails 4
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 ...
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.
Rails 4
Ruby on Rails guide
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"
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.