Rails でロールベースのルーティングを検索すると、この SO の質問が一番上に表示されるため、別のアプローチを提供します。
私は最近、似たようなものを実装する必要がありましたが、コントローラーに多数の条件を持たないようにしたかったのです。これは、ユーザーの役割ごとに完全に異なるデータをロードして表示する必要があるという事実によって悪化しました。Routing Constraintを使用して、決定ロジックをルーティング層に移動することにしました。
# app/constraints/role_route_constraint.rb
class RoleRouteConstraint
def initialize(&block)
@block = block || lambda { |user| true }
end
def matches?(request)
user = current_user(request)
user.present? && @block.call(user)
end
def current_user(request)
User.find_by_id(request.session[:user_id])
end
end
上記のコードの最も重要な部分はmatches?
、ルートが一致するかどうかを判断するメソッドです。このメソッドには、request
作成中のリクエストに関するさまざまな情報を含むオブジェクトが渡されます。私の場合、:user_id
セッション Cookie に保存されているものを検索し、それを使用してリクエストを行っているユーザーを見つけています。
その後、ルートを定義するときにこの制約を使用できます。
# config/routes.rb
Rails.application.routes.draw do
get 'home', to: 'administrators#home', constraints: RoleRouteConstraint.new { |user| user.admin? }
get 'home', to: 'instructors#home', constraints: RoleRouteConstraint.new { |user| user.instructor? }
get 'home', to: 'students#home', constraints: RoleRouteConstraint.new { |user| user.student? }
end
上記の場合、 にリクエストを行う管理者は のホームアクションに/home
ルーティングされ、にリクエストを行うインストラクターは のホームアクションにルーティングされ、にリクエストを行う生徒は のホームにルーティングされます。のアクション。AdministratorsController
/home
InstructorsController
/home
StudentsController
詳しくは
詳細については、最近ブログでこのアプローチについて書きました。