ユーザーが当社の Web サイトのルートに入るか、ログアウトすると、Devise 認証は最初に「続行する前にサインインまたはサインアップする必要があります」と表示します。ページをリロードすると、このメッセージは消えます。
私たちの Web サイトのルートは、以下を持つコントローラーに設定されています。
before_filter :authenticate_user!
このコントローラーをルートにする必要があります。このメッセージを消すには?
ユーザーが当社の Web サイトのルートに入るか、ログアウトすると、Devise 認証は最初に「続行する前にサインインまたはサインアップする必要があります」と表示します。ページをリロードすると、このメッセージは消えます。
私たちの Web サイトのルートは、以下を持つコントローラーに設定されています。
before_filter :authenticate_user!
このコントローラーをルートにする必要があります。このメッセージを消すには?
正しい解決策は、公式 wiki に記載されているように認証済みブロックを設定することです: https://github.com/plataformatec/devise/wiki/How-To:-Require-authentication-for-all-pages
authenticated :user do
root to: 'home#index', as: :authenticated_root
end
root to: redirect('/users/sign_in')
スコープ付きauthenticated
ブロックは、ログインしたときにのみ呼び出されるため、ユーザーを選択したコントローラーに喜んで誘導できます。この例では、認証されていないときにサインイン ページにリダイレクトしますが、これはルート内の任意のアクションである可能性があります。
定義するよりも良い解決策が見つかりませんでした
unauthenticated: ''
/config/locales/devise.en.yml ファイルに。
インデックスだけでメッセージを削除しますか? もしそうなら、あなたは次のようなことをすることができます:
before_filter :authenticate_user!, :except => [:index]
他のアクションを配列に追加することもできます。
これは指定されたアクションを呼び出さないことに注意してくださいauthenticate_user!
。そのため、指定されたアクションに対してユーザーを認証する必要がないことを確認してください。
すべてのページ (ログイン、サインアップなどを除く) が に対して保護されているシナリオでは、before_action :authenticate_user!
Devise を次のSessionController
ようにオーバーライドします。
app/controllers/sessions_controller.rb
class SessionsController < Devise::SessionsController
def new
if flash[:alert] == unauthenticated_message
flash.delete(:alert) unless requested_protected_page?
end
super
end
private
def requested_protected_page?
session[:user_return_to] != root_path
end
def unauthenticated_message
I18n.t('devise.failure.unauthenticated')
end
end
そして、config/routes.rb
そのオーバーライドされたコントローラーを使用するようにファイルに指示します。
devise_for :users, controllers: {
sessions: :sessions,
}
以下に示すように、デバイスのエラーメッセージをカプセル化したと仮定します。
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
次の CSS コードをルート コントローラーのインデックス ビュー ファイルに追加できます。
<style type="text/css">
.notice, .alert { visibility: hidden; }
</style>
これにより、Web サイトのルートからエラー メッセージが表示されなくなります。
ユーザーがログインしているかどうかを解決し、目的の場所にリダイレクトするためだけに、コントローラーで別のアクションを作成できます。
class WelcomeController < ApplicationController
skip_before_filter :authenticate_user!, only: :root
def index
end
def root
flash.keep
redirect_to current_user ? welcome_index_path : new_user_session_path
end
end
これは機能するはずです。もちろん、ApplicationController に含める必要があります。
before_filer: authenticate_user!
そして、welcome#root に設定されたルートルートで