URLのidの部分にid以外のものを指定して、github.com/mynameのようにするために、to_paramメソッドがありましたので使ってみたいと思います。
Rails Document
http://railsdoc.com/references/to_param
Scaffoldで準備
1 2 3 4 |
$ rails new myapp $ cd myapp $ rails g scaffold User name:string $ rails db:migrate |
Models
to_paramメソッドでuser.nameが入るようにします。バリデーションの設定は実際にはもっと必要かと思いますが割愛しております。
app/models/user.rb
1 2 3 4 5 6 7 8 |
class User < ActiveRecord::Base validates_uniqueness_of :name def to_param name end end |
Controllers
find_byでnameを取り出します
app/controllers/users_controller.rb
1 2 3 4 5 6 7 8 9 10 11 12 |
class UsersController < ApplicationController before_action :set_user, only: [:show, :edit, :update, :destroy] ~ 中略 ~ private def set_user @user = User.find_by(name: params[:id]) end end |
Routing
この書き方はrailsのDRYに反している気がしますが、routesが被ってないので動作は問題ありません。間違ってたら教えてください。
user.nameを入れたいroutesのpathは’/’だけにします。
config/routes.rb
1 2 3 4 5 6 |
Rails.application.routes.draw do resources :users, only: [:index, :create, :new] resources :users, path: '/', only: [:show, :edit, :update, :destroy] end |
routesの出力結果はこちらです。
1 2 3 4 5 6 7 8 9 10 |
$ rails routes Prefix Verb URI Pattern Controller#Action users GET /users(.:format) users#index POST /users(.:format) users#create new_user GET /users/new(.:format) users#new edit_user GET /:id/edit(.:format) users#edit user GET /:id(.:format) users#show PATCH /:id(.:format) users#update PUT /:id(.:format) users#update DELETE /:id(.:format) users#destroy |
以上で、/users/:idの部分にuser.nameが入るかと思います!
こちらにその他いろいろな書き方が紹介されています。
https://gist.github.com/agnellvj/1209733
friendly_idというgemを使って実装する記事はこちらです。
https://remonote.jp/rails-friendly-id-url
ご覧いただき、ありがとうございました!