DeviseをRuby on Railsで使用しています。
認証が必要なユーザーが認証を必要とするページにアクセスしようとする場合に、認証されていないユーザーをsessions#newページにリダイレクトする推奨方法は何ですか?
現在、アクセスしようとするルートに一致するルートがないことを示すエラーが表示されます(本番環境で404エラーが発生します)。
このメソッドをapplication_controller.rb
に追加するだけです
protected
def authenticate_user!
if user_signed_in?
super
else
redirect_to login_path, :notice => 'if you want to add a notice'
## if you want render 404 page
## render :file => File.join(Rails.root, 'public/404'), :formats => [:html], :status => 404, :layout => false
end
end
そして、before_filter
別のコントローラーでこのメソッドを呼び出すことができます。
例:
class HomesController < ApplicationController
before_filter :authenticate_user!
## if you want spesific action for require authentication
## before_filter :authenticate_user!, :only => [:action1, :action2]
end
login_path
をroutes.rb
に追加することを忘れないでください
devise_scope :user do
match '/sign-in' => "devise/sessions#new", :as => :login
end
注:アプリ認証用のデバイスを使用するときは常にこの方法を使用します。(Rails 3.2およびRails 4.0.1)
GeekTolが書いたように、または単に置くことができます
before_action :authenticate_user!
コントローラーで。
この場合、deviseはデフォルトのauthenticate_user!を使用します。メソッド。「user_session_path」にリダイレクトし、デフォルトのフラッシュメッセージを使用します。
Authenticate_userを書き換える必要はありません!カスタマイズする場合を除き、メソッド。
私はあなたが単に追加できると思った:before_action:authenticate_user!ユーザーのログインが必要な各コントローラーに。
私はRails初心者ですが、自分の検索でこれを見つけ、アプリケーションでうまく機能します。
Devise独自のHow To: How To:ユーザーが認証できない場合に特定のページにリダイレクトする を参照する必要があります。
私が考えることができる別の選択肢は、保護されたルートをラップするルーティング制約を作成することです。 Deviseの方法に固執する方が良いでしょうが、以下に例を示します。
#On your routes.rb
constraints(Constraints::LoginRequired) do
get '/example'
end
#Somewhere like lib/constraints/login_required.rb
module Constraints
class LoginRequired
def self.matches?(request)
#some devise code that checks if the user is logged in
end
end
end