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

大抵の場合、hoge/:id のような URL でアクセスし、Hoge.find(params[:id]) レコードを探すが、id ではなく、文字列でアクセス出来る様にする方法。

この二つが、メジャーな gem そうでした。今回は stringex を導入して見ました。

適当なプロジェクトを作成

導入デモ用に作るだけです。

mkdir demo_stringex
cd demo_stringex
rails new .
rails g scaffold cat name:string sex:integer breed:string url:string
rake db:migrate

scaffold で簡単に作りました。

cats テーブルの url というフィールドは URL としてアクセスするための文字列が格納されます。

bundle でインストールして導入

gem 'stringex'

Gemfile に追記して bundle install します。

インストールができたら導入していきます。

文字列で探したいモデルに以下のように追記します。

class Cat < ActiveRecord::Base
acts_as_url :name
def to_param
url
end
end

acts_as_url の第一引数に、id の換わりにしたいフィールド名を指定します。

find メソッド修正

以下のようにインスタンスを取得している find メソッドを find_by_url に変更する。

# @cat = Cat.find(params[:id])
 @cat = Cat.find_by_url(params[:id])

scaffold では show, edit, update, destroy で使われているのでそれぞれ書き換える。

これで導入は完了です。データを追加してみます。

rails c 
Cat.create([
  {:name => "okaka", :sex => 1, :breed => "Munchkin"},
  {:name => "konbu", :sex => 2, :breed => "Abyssinian"},
  {:name => "koume", :sex => 2, :breed => "MaineCoon"}
])

レコードを作成すると、name の文字列から url を作り出して保存されます。

サーバーを立ち上げて動作させてみると、http://localhost:3000/cats/1 のように id ではなく http://localhost:3000/cats/okaka のように url でアクセスできるようになりました。

オプションについて

acts_as_url に渡すオプションについてメモ。

:url_attribute

url 用の文字列を格納するフィールドを指定。デフォルトは url。

:scope

The name of model attribute to scope unique urls to. There is no default here.

デフォルトは無し。

:only_when_blank

:url_attribute に指定されたフィールドが空の場合にのみ、url の生成を行う。

デフォルトは false (常に生成される)

:sync_url

url のベースとなるフィールドが更新されたら、url も更新する。

ベースにしているフィールドが更新される可能性があるなら true に設定しないとアクセスできなくなる。

デフォルトは false。

シェアする

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

フォローする