web-dev-qa-db-ja.com

Devise Loginをルートページに設定

ルートに次のコードを使用しています。

devise_for :user, 
  :as => '', 
  :path_names => { 
    :sign_in => "", 
    :sign_out => "logout", 
    :sign_up => "register" 
  }

しかし、ログアウトして/logoutに移動すると、次のエラーが表示されます。

{:action => "new"、:controller => "devise/sessions"}に一致するルートはありません

ルートパスを:sign_inアクションに設定するにはどうすればよいですか?

76
Logan Bailey

エラーについて質問している人からのフォロー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

これは私のためにうまくいった

113
Peter Nixey
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。

82
VvDPzZ
root :to => "devise/sessions#new"

デフォルトのホームルートを設定する必要がありました。昨夜(質問を投稿する前に)一晩中これを試したように感じましたが、今はうまくいっています。ログアウトしている場合、Deviseは、未定義のルートパスにリダイレクトしようとします。

23
Logan Bailey

(これは 推奨編集 として投稿されましたが、それ自体が答えであるはずでした。意味があるかどうかはわかりません。親愛なる匿名編集者:この回答を自分のものとして自由に再投稿してください。コメントを残して、このコピーを削除します。)

root :to => redirect("/users/login")
14
Gilles

これを@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部分を省略することで、既存のリンクを変更する必要がなくなりました。

9
Doug Steinberg

異なるユーザーロールを持っていると思います。その場合、次のようなスコープをユーザーリソースに追加する必要があります。

  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

3
miccet

これらのソリューションのいくつかは、あまりにも複雑です。 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
1
Jesse Farmer

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
0
Rui Castro