Railsで他のControllerのactionを呼び出す

Railsで別のpathで同じページを表示したかったので、ちょっとお試し。
(以下のアクセスで同じページを表示したい)

/users
/hoges

Renderでやる場合

元になるコントローラー

class UsersController < ApplicationController
  def index
    @users = User.all
  end
end

がある時に、

class HogeController < ApplicationController
  def users
    @users = User.all
    render template: 'users/index'
  end
end

とやればいいんですが、viewで必要な変数が多い時に処理が冗長になる。

元になるコントローラを親classにしてしまう

class UsersController < ApplicationController
  def index
    @users = User.all
  end
end

こいつ↑(Users#index)を他のコントローラー↓(Hoge)から呼びたい。

# 親classをUsersControllerに
class HogeController < UsersController
  def users
    # 親のindexを呼び出す
    public_method(:index).super_method.call
  end
end

これでHoge#usersがUsers#indexになりました。

routesに設定する

ただ、普通にやるなら

get '/users', to: 'users#index'
get '/hoges', to: 'users#index'

これで良いですが・・w

同じページを別のpathで表示するのであれば、canonicalの指定はお忘れなく。