2011-02-10 27 views
65

Tôi đang sử dụng đoạn mã sau cho các tuyến đường của tôi:Thiết lập mưu Đăng nhập vào là root trang

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

Nhưng khi tôi đăng xuất khỏi và tôi goto /logout tôi nhận được lỗi sau:

No route matches {:action=>"new", :controller=>"devise/sessions"}

Làm cách nào để thiết lập đường dẫn gốc thành hành động :sign_in?

Trả lời

99

Để theo trên từ những người đang yêu cầu về lỗi Could not find devise mapping for path "/" có một cách giải quyết.

Bạn sẽ thấy rằng có một đầu mối trong nhật ký của bạn mà có lẽ sẽ nói:

[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] 

Vì vậy, tôi thử lại phương pháp này mà thay vào đó quấn nó (như @miccet suggets) bên trong một khối phạm vi:

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

này làm việc tốt cho tôi

+3

này đã gửi cho tôi ra khỏi một vòng lặp vô hạn, đọc thân mến người có cùng một vấn đề, bước tiếp theo của câu trả lời là ở đây http://stackoverflow.com/questions/19855866/how-to-set-devise-sign-in-page-as-root-page-in-rails – Jngai1297

3

Tôi đoán bạn có vai trò người dùng khác nhau. Nếu bạn làm thế, bạn phải thêm một phạm vi như thế này để các nguồn lực sử dụng:

devise_scope :user do 
    get "/logout" => "devise/sessions#destroy" 
    end 

Bạn có thể đọc thêm về trọng đưa ra các tuyến đường ở đây: https://github.com/plataformatec/devise/wiki/How-To:-Change-the-default-sign_in-and-sign_out-routes

+0

Nó không đến nỗi tôi không thể truy cập các tuyến đường logout. Đó là khi bạn đăng xuất, tuyến đường đăng xuất sẽ chuyển hướng bạn đến thư mục gốc. –

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

tôi cần phải thiết lập các gốc chủ mặc định . Tôi cảm thấy như tôi đã thử qua đêm nay (trước khi đăng câu hỏi), nhưng bây giờ nó đang hoạt động. Nếu bạn đã đăng xuất, Devise sẽ chuyển hướng bạn đến đường dẫn gốc mà tôi đã không xác định.

+13

BẤT CỨ Ý TƯỞNG TẠI SAO TÔI NHẬN ĐƯỢC NÀY? Không thể tìm thấy bản đồ lập bản đồ cho đường dẫn "/". Có lẽ bạn quên bọc tuyến đường của bạn bên trong khối phạm vi? – baash05

+0

Có một giải pháp cho điều này "không thể tìm thấy lập bản đồ" lỗi mà vì lợi ích của sự rõ ràng tôi đã đăng trong một câu trả lời riêng biệt trên trang này: http://stackoverflow.com/a/12994856/400790 –

+0

câu trả lời là ngay bên dưới .. – Nithin

13

(Điều này đã được đăng dưới dạng suggested edit, nhưng phải là câu trả lời của riêng nó. Tôi không biết điều đó có hợp lý hay không. và để lại cho tôi một lời nhận xét vì vậy tôi sẽ xóa bản sao này.)

root :to => redirect("https://stackoverflow.com/users/login") 
+3

Xin lưu ý, tuyến đường này là một chuyển hướng. Nó không hiển thị trang đăng nhập trên URL gốc. Để làm điều này, bạn cần phải tạo ra các tuyến đường devise_scope: hướng dẫn làm root: to => "đưa ra/phiên # mới" cuối theo đề nghị của @PeterNixey – Robert

72
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 

Chỉ cần như thế này, thử nghiệm on Rails Rails 4.1 .0.rc1.

+1

Tôi nghi ngờ rằng tất cả phụ thuộc vào phiên bản của Rails và Devise. Điều này chắc chắn làm việc cho Rails 4 với Devise 3 - hầu hết các câu trả lời khác thì không. –

+0

Tôi nghĩ đây là cách tốt nhất để làm điều đó. Nó hoạt động với Rails 4.2.7.1 và Devise 4.2.0 – luislezcair

+0

Tuyệt vời! Tôi thích mã này. Cảm ơn bạn. – Penguin

0

Sử dụng ray 3.2devise 3.2.3 tôi quản lý để thiết lập trang của tôi về nhà "nhà # index" (điều khiển # hành động) như trang đăng nhập làm cho những thay đổi sau.

# 1 gia tăng các hình thức đăng nhập vào trang chủ:

<%= 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 thêm phương pháp RESOURCE_NAME, tài nguyên và 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 

# 3 Tạo một phiên tùy chỉnh điều khiển app/controllers/người dùng/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 Bỏ qua các tuyến đường phiên và thiết lập các tùy chỉnh bộ điều khiển phiên trong cấu hình/tuyến đường.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 
9

Tôi đã làm việc này với câu trả lời @VvDPzZ. Nhưng tôi đã phải sửa đổi nó một chút

devise_scope :business_owner do 
    authenticated do 
     root to: 'pages#dashboard' 
    end 

    unauthenticated do 
     root to: 'devise/sessions#new', as: 'unauthenticated_root' 
    end 
    end 

tôi phải quảng cáo to: trong khai báo đường dẫn gốc. Tôi cũng đã xóa as: :authenticated_root vì tôi đã có một số địa điểm trong đơn đăng ký tham chiếu root_path trong các liên kết. Bằng cách rời khỏi phần as: :authenticated_root tôi không phải thay đổi bất kỳ liên kết hiện có nào của mình.

0

Một số giải pháp này quá phức tạp. Chỉ cần sử dụng kỹ năng Rails của bạn để tát Devise lộn ngược đầu:

Thêm 'get' 'users/root', to: 'users#root' vào config/routes.rb.

Trong UsersController làm điều gì đó như:

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 
Các vấn đề liên quan