12/08/2018, 13:42

Pretty URL, dùng gem Friendy_id cơ bản

Pretty url là gì? Theo đúng nghĩa đen là để cho URL của bạn trông đẹp hơn. Ví dụ Ban đầu: http://localhost:3000/users/2 Sau đó: http://localhost:3000/users/tranha Cách dùng (ở đây mình dùng cho user) gem "friendly_id" , "~> 5.1.0" bundle install rails generate ...

Pretty url là gì? Theo đúng nghĩa đen là để cho URL của bạn trông đẹp hơn.

Ví dụ

Ban đầu: http://localhost:3000/users/2

Sau đó: http://localhost:3000/users/tranha

Cách dùng (ở đây mình dùng cho user)

gem "friendly_id","~> 5.1.0"
bundle install
rails generate friendly_id
rails generate scaffold user username:string slug:string:uniq
rake db:migrate

Nếu bạn đã tạo bảng user trước đó rồi, thì chỉ cần thêm 2 dòng sau vào bảng user:

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :username
      t.string :email
      t.string :phone_number
      t.string :address
      t.string :password_digest
      t.boolean :is_admin, default: false
      t.string :slug #thêm dòng này

      t.timestamps null: false
    end
    add_index :users, :slug, unique: true #thêm dòng này
  end
end

Trong model

class User < ActiveRecord::Base
  extend FriendlyId
  friendly_id :username, use: :slugged
end

Trong controller

Bây giờ, thay vì dùng User.find() mà dùng ta dùng User.friendly.find()

Lưu ý

Nếu username bạn không để unique: true thì trong trường hợp này, bạn nên dùng slug_candidates

class Restaurant < ActiveRecord::Base
  extend FriendlyId
  friendly_id :slug_candidates, use: :slugged

  def slug_candidates
    [
      :username,                      # users/username
      [:username, :email],            # users/username-email
      [:username, :email, :address],  # users/username-email-address
    ]
  end
end

Nếu bạn dùng gem cancancan

load_and_authorize_resource sẽ mặc định là find id, vậy nên, muốn dùng friendly_id ở đây

Trong controller tương ứng:

class UsersController < ApplicationController
  load_and_authorize_resource find_by: :slug
  [...]
end
0