Deviseログインをルートページに設定する


82

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

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

しかし、ログアウトして移動すると/logout、次のエラーが発生します。

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

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

回答:


123

エラーについて質問している人々からフォローアップする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が提案するように)ラップしました。

devise_scope :user do
  root to: "devise/sessions#new"
end

これは私にとってはうまくいきました


6
これは無限ループ、同じ問題を抱えている親愛なる読者に私をオフに送信され、解答の次のステップはここにあるstackoverflow.com/questions/19855866/...
Jngai1297

92
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 Rails4.1.0.rc1でテストされています。


1
RailsとDeviseのバージョンに依存しているのではないかと思います。これは確かにDevise3を使用するRails4で機能します-他のほとんどの回答は機能しませんでした。
クリスルイス

これが最善の方法だと思います。Rails4.2.7.1およびDevise4.2.0で動作します
Luis

23
root :to => "devise/sessions#new"

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


14
なぜ私がこれを手に入れるのか?パス「/」のデバイスマッピングが見つかりませんでした。ルートをスコープブロック内にラップするのを忘れたのではないでしょうか。
baash05 2012

この「
デバイス

15

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

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

3
このルートはリダイレクトであることに注意してください。ルートURLにサインインページは表示されません。これを行うには、@ PeterNixey
Robert

11

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


3

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

  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を ご覧ください。


ログアウトルートにアクセスできないほどではありません。ログアウトすると、ログアウトルートによってルートにリダイレクトされます。
ローガンベイリー

1

これらのソリューションのいくつかは非常に複雑です。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

0

Rails 3.2デバイス3.2.3を使用して、次の変更を行うログインページとしてホームページ " 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 app / holdpers / application_helper.rbにメソッドresource_name、resource、およびdevise_mappingを追加しました:

def resource_name
  :user
end

def resource
  @resource ||= User.new
end

def devise_mapping
  @devise_mapping ||= Devise.mappings[:user]
end

#3カスタムセッションコントローラー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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.