Rails3 id でなく文字列をURLにしてアクセスしたい (friendly_id編)

前回のポストでリンクだけはった friendly_id を導入してみる。

ほぼ README をなぞっただけですが。

インストール

いつも通り、Gemfile に追記してインストールします。gem install friendly_id でも良いです。

gem "friendly_id", "~> 4.0.0"

下準備

簡単な CRUD を Scaffold で生成します。

slug はスラッグが格納されるフィールドです。

rails generate scaffold user name:string slug:string

以下を生成された migration(db/migrate/*_create_users.rb) に追記する

add_index :users, :slug, unique: true

DB 定義は完了。migrate します。

rake db:migrate

user モデルに実装。app/models/user.rb に追記。

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

コンソールから適当にユーザーを作ります。

rails c
User.create name: "Azusa Nakano"
User Load (0.3ms)  SELECT "users".* FROM "users" WHERE ("slug" = 'azusa-nakano' OR "slug" LIKE 'azusa-nakano--%') ORDER BY LENGTH("slug") DESC, "slug" DESC LIMIT 1
 SQL (49.9ms)  INSERT INTO "users" ("created_at", "name", "slug", "updated_at") VALUES (?, ?, ?, ?)  [["created_at", Thu, 12 Jan 2012 12:52:47 UTC +00:00], ["name", "Azusa Nakano"], ["slug", "azusa-nakano"], ["updated_at", Thu, 12 Jan 2012 12:52:47 UTC +00:00]]
 => #<User id: 3, name: "Azusa Nakano", slug: "azusa-nakano", created_at: "2012-01-12 12:52:47", updated_at: "2012-01-12 12:52:47">

Create 直前で重複するスラッグがないかを検索している様子がうかがえます。
name の値から、slug が自動生成されて格納されています。

ブラウザで見てみましょう。

rails s

http://localhost:3000/users

show のリンクが users/show/1 ではなく、users/show/azusa-nakano のように、

スラッグでアクセスできるようになっています。

stringex の時のように、find メソッドを置き換える必要はありません。

数値を渡すと id で、文字列を渡すと slug で検索してくれるようです。

ruby-1.9.2-p290 :011 > User.find 3
 User Load (0.1ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 3]]
 => #<User id: 3, name: "Azusa Nakano", slug: "azusa-nakano", created_at: "2012-01-12 12:52:47", updated_at: "2012-01-12 12:52:47">
ruby-1.9.2-p290 :012 > User.find "azusa-nakano"
 User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."slug" = 'azusa-nakano' LIMIT 1
 => #<User id: 3, name: "Azusa Nakano", slug: "azusa-nakano", created_at: "2012-01-12 12:52:47", updated_at: "2012-01-12 12:52:47">

ドキュメントには設定を変える方法なども載っているようなのでそのうちにでも検証したいです。

とりあえず上記の導入だけで、スラッグが有効になるのは非常に手軽で助かりますね。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする