Devise 로그인을 루트 페이지로 설정


84

내 경로에 다음 코드를 사용하고 있습니다.

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

그러나 로그 아웃하고 /logout이동하면 다음 오류가 발생합니다.

{: action => "new", : controller => "devise / sessions"}와 일치하는 경로가 없습니다.

작업 할 루트 경로를 어떻게 설정 :sign_in합니까?

답변:


125

오류에 대해 묻는 사람들의 후속 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

이것은 나를 위해 잘 작동했습니다.


6
이것은 저를 무한 루프로 보냈습니다. 같은 문제가있는 독자 여러분, 대답의 다음 단계는 여기에 있습니다. stackoverflow.com/questions/19855866/…
Jngai1297

93
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에서 테스트되었습니다.


1
나는 그것이 모두 Rails와 Devise의 버전에 달려 있다고 생각합니다. 이것은 Devise 3이 설치된 Rails 4에서 확실히 작동합니다. 대부분의 다른 답변은 그렇지 않았습니다.
Chris Lewis

이것이 최선의 방법이라고 생각합니다. Rails 4.2.7.1 및 Devise 4.2.0
Luis Lezcano Airaldi

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

기본 홈 루트를 설정해야했습니다. 어제 밤새도록 (질문을 게시하기 전에) 이것을 시도한 것처럼 느꼈지만 지금은 작동하고 있습니다. 로그 아웃 한 경우 Devise는 내가 정의하지 않은 루트 경로로 리디렉션을 시도합니다.


14
내가 이것을 얻는 이유가 무엇입니까? 경로 "/"에 대한 장치 매핑을 찾을 수 없습니다. 스코프 블록 안에 경로를 감싸는 것을 잊었습니까?
baash05

명확성을 위해이 페이지에 별도의 답변을 게시 한이 "장치 매핑을 찾을 수 없음"오류에 대한 해결책이 있습니다. stackoverflow.com/a/12994856/400790
Peter Nixey

15

(이것은 제안 된 편집 으로 게시 되었지만 그 자체의 답변이어야했습니다. 그게 말이되는지 모르겠습니다. 익명의 편집자에게 :이 답변을 자신의 것으로 다시 게시하고 의견을 남겨주세요. 이 사본을 삭제하겠습니다.)

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

3
이 경로는 리디렉션입니다. 루트 URL에 로그인 페이지를 표시하지 않습니다. 이렇게하려면 경로 devise_scope 작성해야합니다 : 사용자가 루트 않는 => "유증 / 세션 # 새로운"끝까지 @PeterNixey에 의해 제안
로버트

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


로그 아웃 경로에 액세스 할 수 없을 정도로 많지 않습니다. 로그 아웃하면 로그 아웃 경로가 루트로 리디렉션됩니다.
Logan Bailey

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.2devise 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 / heldpers / 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.