almost 4 years ago

今天要介紹的是friendly_id這個GEM
friendly_id的主要功能就是可以幫我們客製化網址
正常情況下我們的product#show會是這樣子的:www.example.dev/products/:id
利用friendly_id就可以將它變成www.example.dev/products/:name或是其他你想要的組合
在這個rails cast中有教使用friendly_id和不使用friendly_id的做法
若不使用friendly_id,基本原理就是在product model下改寫to_params的method,細節可以看Rails Cast
今天要教學的是使用friendly_id顯示product的name attributes,並且支援中文網址
首先是gemfile設定:

# rails4以上版本要裝5.0.0以上的friendly_id

gem 'friendly_id', '~> 5.0.0'
# babosa這個gem是讓我們做字元轉換的,要支援中文網址時會用到

gem "babosa"

接下來建立必要的資料表:

rails generate friendly_id
rails generate migration add_slug_to_products slug:string:uniq
rake db:migrate

資料表建立完成後在Produc Model下再這樣設定:

class Product < ActiveRecord::Base
  extend FriendlyId
  friendly_id :name, use: :slugged
end

接著到config/initializers/friendly_id.rb下把自動查找的功能打開,將config.use :finders這段解除註解就可以了。
(不打開finders也可以,但就必須要把Product.find(params[:id])的地方改寫成Product.friendly.find(params[:id])

到目前這個步驟為止就可以使用www.example.dev/products/:name的網址了
接下來就是要支援中文並且客製化想要顯示的網址,首先要改寫normalize_friendly_id(input)的method讓中文字可以顯示,接下來就是改friendly_id讀取的symbol就可以了

class Product < ActiveRecord::Base
  extend FriendlyId
  # 把:name改成:slug_candidates
  friendly_id :slug_candidates, use: :slugged
  
  # 原本是input.to_s.parameterize,但是parameterize只支援英文跟數字,所以改用babosa的to_slug
  def normalize_friendly_id(input)
    input.to_s.to_slug.normalize.to_s
  end
  
  # 定義slug_candidates,預設會找第一個,如果有重複的name就會找第二個(name-price),最後才會生成亂序
  def slug_candidates
    [
      :name,
      [:name, :price]
    ]
  end
end

參考資料:

http://railscasts.com/episodes/314-pretty-urls-with-friendlyid
https://github.com/norman/friendly_id
http://blog.roachking.net/blog/2014/01/17/babosa-friendly-id-solve-chinese-problems/

← Rails Association - Self Join Rails Delegate →
 
comments powered by Disqus