こんばんは
アロハな男、やすのりです!
今日はポートフォリオ作成時にルーティングの記述方法について、悪戦苦闘してしまったので同じことで悩まれている方や、自分が忘れた時用の備忘録として書き留めておこうと思います。
長くなりましたので、先に結論だけ載せておきますね。
結論
検索用のボタンを押した際に移動するページのURLを、コントローラーの管理下にしたくない場合は、
Rails.application.routes.draw do
get '/:name', to: 'コントローラー名#edit'
end
で、大丈夫です!!
↓参考ページはこちら
Railsドキュメント ルーティング
【ルーティング設計】1つのアクションで複数のビューを切り替えて表示する方法
それじゃあ、下に詳しく書き連ねていきますね。
状況
トップページから__『ホテル』__と書かれたボタンを押すとホテルカテゴリーの検索ページへ遷移する機能を作成したかったんですが、URLをlocalhost:3000/hotel
という形にしたかったので、まずはコントローラーをそれぞれ別に作成してルーティングに記述してみました。
Rails.application.routes.draw do
resources :hotels, only [:index]
end
そうすると、
hotels GET /hotels(.:format) hotels#index
というルーティングが作成されました。
これだとURLは希望に近い形で実現はできましたが、項目が多くなればなるほど別途コントローラーを作成しないといけません。
と、いうことは呼び出されるコントローラーを変更すればいいんだ!と思い
Rails.application.routes.draw do
resources :hotels, only [:index], controller: 'experiences'
end
こうすれば、アクセスした時にexperiencesコントローラーのindexアクション
が呼び出される様になるので、viewファイルはテンプレートファイル等を利用することで表示することができると思いますが、この場合は何も記述のないhotelsコントローラー
が出来上がってしまいます。
今回は1つで記述していますが、どんどん項目が増えればその分ルーティングの記述も多くなってファイルも増えていってしまいます。
どうしたものか...と思っていろいろ調べていると見つけました!!
まずは、URLを指定のものにしたいなら
Rails.application.routes.draw do
get '/hotel', to: 'experiences#index'
end
と記載するだけで大丈夫でした!!
これは、Railsドキュメントのルーティングページに記載がされていました。
しっかりドキュメントを確認することの大切さを改めて実感しました...
さて、これだけでも当初の目標である『URLをlocalhost:3000/hotel
にする』というのは完了していますが、今のままだとページが/hotel
だけじゃなく他の項目も増えた時にどんどん記述が増えていってしまいますね。
せっかくなので、こちらも改善しちゃいましょう!!
改善後
experiencesコントローラー
にeditアクション
というものを新たに定義してそこに全てのルーティングがいく様にまとめることができるんです!!
class ExperiencesController < ApplicationController
def edit
render "/#{params[:name]}"
end
end
Rails.application.routes.draw do
get '/:name', to: 'experiences#edit'
end
また、URLの/:name
という部分では、リクエストの送信時にparams内のキーに:name
を設定して部分テンプレートのファイル名をバリューとして渡すことで、editアクション
内のrenderメソッド
で該当するビューファイルを表示させています。
今回の経験を経て
公式ドキュメントを読むことの大切さや、先人の方が残して下さった文献のありがたみが身に染みます...
これからも何か問題があれば、どんどん調べていきたいと思います!!
(他力本願な感じもするけど大丈夫かな...)