kansiho's memo

ruby, python, javascript. Rails, wordpress, OpenCV, heroku...

Rails5 user_idじゃなくてusernameでusers#show

https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQOYCLQiJswVDipk0KNGHm9IBIqjKJkusWSZ30Y_8kbpkZRux3F8Q

twitter.com/kansiho みたいな感じでuser nameでusers#showにつなげたいときありますよね。

config/routes.rb

Rails.application.routes.draw do
    get '/:username' => 'users#show', :constrain => { :username => /[a-zA-Z-]+/ }
end

このとき、最終行に書くことを注意してください。 root_url/settings とかもusernameだと解釈されないように、最後にすることで優先順位を下げるわけです。 404ページなんかもこのように最終行付近に設定しますよね。

app/controller/users_controller.rb

class UsersController < ApplicationController

  before_action :set_user, only: [ :show]

  def set_user
    @user = User.find_by(username: params[:username])
    if @user == nil
      redirect_to root_path(notice: "ユーザーが存在しません")
    end
  end
end

ターミナルで確認してみましょう。

$ rake routes

 GET    /:username(.:format)              users#show {:constrain=>{:username=>/[a-zA-Z-]+/}}

設定されました!

参考

stackoverflow.com

rails で /users/:id ではなく /:username な routing にする方法 · Yuichi Takada