Ruby on Railsのルーティングでresourcesが生成するURLにおけるID以外によるレコード指定

Ruby on Rails
by ゆ〜ぎり @

Ruby on Railsのルーティングでresourcesが生成するURLにおいてID以外でレコードを指定する手順のメモ。

前提

目標

  • Ruby on Railsのルーティングでresourcesが生成するURLにおいてID以外でレコードを指定できるようにする。
    • デフォルトで生成されるURLは,http://localhost:3000/articles/1のようにリソースをIDで指定する。1の部分がリソースのID。

環境

  • カレントディレクトリはRailsアプリケーションのルートディレクトリとする。

仕様

  • 対象のリソースはArticleというモデルとする。
  • IDの代わりにnameという属性で指定する。

手順

  1. Articleモデルの変更
  2. 確認

Articleモデルの変更

  1. Articleモデルのコード(app/models/article.rb)に追記して次の様にする。
    class Article < ActiveRecord::Base
      (略)
      def to_param
        return name.parameterize
      end
      def self.find(key)
        return find_by_name(key)
      end
    end
    
    • 3〜8行目を追加する。
    • to_paramメソッドとfindメソッドをオーバーライドしている。
    • to_paramメソッドでは,parameterizeメソッドによってname属性をURLに適した形式に変換している。
    • findメソッドでは,find_by_nameメソッドによってname属性でレコードを検索するようにしている。

確認

ナビゲーションリンクが表示され,各ページへ移動できるか確認する。

  1. Railsアプリケーションを起動させる。
  2. http://localhost:3000/articlesにアクセスし,各ArticleへのリンクのURLを確認する。http://localhost:3000/articles/sampleのように,IDだった部分がname属性の内容に変わっていれば正しい。
  3. Articleへのリンクから正常に移動できることを確認する。

補足

コントローラのコード

Article.findメソッドをオーバーライドしたので,ArticlesController(app/controllers/articles_controller.rb)のコードは変更する必要が無い。
例えば,以下のコードはparams[:id]がIDではなくname属性の内容になっているのでそのまま動作する。
@article = Article.find(params[:id])

TOP