ルートに次のコードを使用しています。
devise_for :user,
:as => '',
:path_names => {
:sign_in => "",
:sign_out => "logout",
:sign_up => "register"
}
しかし、ログアウトして/logout
に移動すると、次のエラーが表示されます。
{:action => "new"、:controller => "devise/sessions"}に一致するルートはありません
ルートパスを:sign_in
アクションに設定するにはどうすればよいですか?
エラーについて質問している人からのフォローCould not find devise mapping for path "/"
回避策があります。
ログに次のような手がかりがあることがわかります。
[Devise] Could not find devise mapping for path "/".
This may happen for two reasons:
1) You forgot to wrap your route inside the scope block. For example:
devise_scope :user do
match "/some/route" => "some_devise_controller"
end
2) You are testing a Devise controller bypassing the router.
If so, you can explicitly tell Devise which mapping to use:
@request.env["devise.mapping"] = Devise.mappings[:user]
そのため、アプローチを再試行しましたが、代わりにスコープブロック内で(@miccet suggetsとして)ラップしました。
devise_scope :user do
root to: "devise/sessions#new"
end
これは私のためにうまくいった
devise_for :users
devise_scope :user do
authenticated :user do
root 'home#index', as: :authenticated_root
end
unauthenticated do
root 'devise/sessions#new', as: :unauthenticated_root
end
end
このように、Rails Rails 4.1.0.rc1。
root :to => "devise/sessions#new"
デフォルトのホームルートを設定する必要がありました。昨夜(質問を投稿する前に)一晩中これを試したように感じましたが、今はうまくいっています。ログアウトしている場合、Deviseは、未定義のルートパスにリダイレクトしようとします。
(これは 推奨編集 として投稿されましたが、それ自体が答えであるはずでした。意味があるかどうかはわかりません。親愛なる匿名編集者:この回答を自分のものとして自由に再投稿してください。コメントを残して、このコピーを削除します。)
root :to => redirect("/users/login")
これを@VvDPzZの回答で動作するようにしました。しかし、私はそれをわずかに修正しなければなりませんでした
devise_scope :business_owner do
authenticated do
root to: 'pages#dashboard'
end
unauthenticated do
root to: 'devise/sessions#new', as: 'unauthenticated_root'
end
end
ルートパス宣言にto:
を追加する必要がありました。また、リンクのas: :authenticated_root
を参照するアプリケーションの場所が既にいくつかあるため、root_path
も削除しました。 as: :authenticated_root
部分を省略することで、既存のリンクを変更する必要がなくなりました。
異なるユーザーロールを持っていると思います。その場合、次のようなスコープをユーザーリソースに追加する必要があります。
devise_scope :user do
get "/logout" => "devise/sessions#destroy"
end
Deviseルートのオーバーライドについて詳しくは、こちらをご覧ください: https://github.com/plataformatec/devise/wiki/How-To:-Change-the-default-sign_in-and-sign_out-routes
これらのソリューションのいくつかは、あまりにも複雑です。 Railsを使用するだけです:
'get' 'users/root', to: 'users#root'
をconfig/routes.rbに追加します。
UsersControllerで次のようにします。
def root
if user_signed_in?
redirect_to root_for_signed_in_user_path (or whatever)
else
redirect_to new_user_session_path
end
end
Rails 3.2およびdevise 3.2.を使用して、ホームページ "home#index"(controller#action)をログインページとして設定することができます。次の変更を行います。
#1ログインフォームをホームページに追加しました:
<%= simple_form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
<%= f.input :email %>
<%= f.input :password %>
<%= f.button :submit %>
<% end %>
#2メソッドresource_name、resource、およびdevise_mappingをapp/heldpers/application_helper.rbに追加しました。
def resource_name
:user
end
def resource
@resource ||= User.new
end
def devise_mapping
@devise_mapping ||= Devise.mappings[:user]
end
#カスタムセッションコントローラーを作成app/controllers/users/sessions_controller.rb:
class Users::SessionsController < Devise::SessionsController
protected
# This method tell sessions#create method to redirect to home#index when login fails.
def auth_options
{ scope: resource_name, recall: 'home#index' }
end
end
#4セッションルートをスキップし、カスタムセッションコントローラーをconfig/routes.rbでセットアップします。
devise_for :users, path: 'auth', skip: [:sessions],
controllers: {
sessions: 'users/sessions'
}
as :user do
get 'auth/sign_in' => 'home#index', as: :new_user_session
post 'auth/sign_in' => 'users/sessions#create', as: :user_session
delete 'auth/sign_out' => 'users/sessions#destroy', as: :destroy_user_session
end