+1

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

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

Ruby on Rails guide

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à titlecontent 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

Viblo
Let's register a Viblo Account to get more interesting posts.