ユーザーがログインしている場合は、ユーザー#showをルートパスにします。そうでなければ、ルートパスはstatic_pages#homeでなければなりません。Deviseを使用せずにログインしたユーザーに別のルートパスを指定する
Devise gemを使用せずにどのように達成できるのか教えてください。
ユーザーがログインしている場合は、ユーザー#showをルートパスにします。そうでなければ、ルートパスはstatic_pages#homeでなければなりません。Deviseを使用せずにログインしたユーザーに別のルートパスを指定する
Devise gemを使用せずにどのように達成できるのか教えてください。
あなたのルートファイルのif/elseステートメントが正しくないと思います。ルートファイル内のビジネスロジックと考えてください。あなたのビジネスロジックは、あなたのモデル(ActiveRecordではなく、普通の古いルビクラスでもかまいません)や、コントローラの中のコントローラ(この場合のような)の方がコントローラのほうが適しているかどうかがモデルにあります。
ユーザー認証のためにワーデンのようなミドルウェアを使用していないと仮定した場合、ルートファイルでデータベースのクエリと認証を行う必要があります。これはそこに属していない別のフラグでなければなりません。同様に、あなたのビューでSQLクエリを実行するようなものです。
申し訳ありませんが、私の意見を正当化したいと思います。さて、可能な解決策に戻りましょう。
/elseをチェックして正しいパスにリダイレクトする場合は、何らかのコントローラアクションにルートパスを設定します。
# routes.rb
root 'static_pages#home'
# StaticPagesController.rb
before_filter :redirect_if_logged_in
def redirect_if_logged_in
redirect_to(user_path(@user)) if @user # check if user logged in
end
またはこれに類する操作はusers#show
です。どのケースにも最適です。
これを行うために、あなたはおそらくconstraintを定義する必要があると思い、ここで最も重要な方法は、そのような
# in constraints/homepage_constraint.rb
class HomepageConstraint
def matches?(request)
# in most cases, you'd store your user_id or other params for determining the current user in a session
request.session[:user_id].present?
end
end
routes.rb
# Rails route is based on the order, place the constraint here to check if there is a current user, if the `matches?` returns false, it would use the generic root route
root 'users#show', constraints: HomepageConstraint.new
root 'static_pages#home'
として
matches?
です