Đặt Devise Login thành trang gốc


83

Tôi đang sử dụng mã sau cho các tuyến đường của mình:

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

Nhưng khi tôi đăng xuất và tôi truy cập, tôi /logoutgặp lỗi sau:

Không có tuyến nào phù hợp với {: action => "new",: controller => "devise / session"}

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

Câu trả lời:


123

Để theo dõi từ những người đang hỏi 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 manh mối trong nhật ký của bạn có thể sẽ cho biết:

[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 cách tiếp cận nhưng thay vì gói nó (dưới dạng @miccet suggets) bên trong một khối phạm vi:

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

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


6
Này đã gửi cho tôi ra khỏi một vòng lặp vô hạn, đọc thân mến những người có cùng một vấn đề, bước tiếp theo của câu trả lời là ở đây 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

Giống như điều này, được thử nghiệm trên 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 hoạt động cho Rails 4 với Devise 3 - hầu hết các câu trả lời khác không.
Chris Lewis

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à lập mưu 4.2.0
Luis Lezcano Airaldi

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

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


14
MỌI Ý TƯỞNG TẠI SAO TÔI LẤY ĐƯỢC ĐIỀU NÀY? Không thể tìm thấy ánh xạ devise cho đường dẫn "/". Có thể bạn quên bọc tuyến đường của mình bên trong khối phạm vi?
baash05

Có một giải pháp cho lỗi này "không thể tìm thấy bản đồ devise" 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: stackoverflow.com/a/12994856/400790
Peter Nixey

15

(Đây đã được đăng dưới dạng một chỉnh sửa được đề xuất , nhưng lẽ ra phải là một câu trả lời của riêng nó. Tôi không biết nó có hợp lý hay không. Kính gửi biên tập viên ẩn danh: vui lòng đăng lại câu trả lời này như của riêng bạn và để lại nhận xét cho tôi vì vậy tôi sẽ xóa bản sao này.)

root :to => redirect("/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. Để thực hiện việc này, bạn cần tạo tuyến đường devise_scope: user do root: to => "devise / session # new" kết thúc theo đề xuất của @PeterNixey
Robert

11

Tôi có điều này để làm việc 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 phần khai báo đường dẫn gốc. Tôi cũng đã xóa as: :authenticated_rootvì tôi đã có một số vị trí trong ứng dụng của mình tham chiếu root_pathtrong các liên kết. Bằng cách bỏ đi as: :authenticated_rootphần này, tôi không phải thay đổi bất kỳ liên kết nào hiện có của mình.


3

Tôi đoán bạn có các vai trò người dùng khác nhau. Nếu bạn có, bạn phải thêm một phạm vi như thế này vào tài nguyên người dùng:

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

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


Không đến nỗi tôi không thể truy cập vào lộ trình đăng xuất. Đó là khi bạn đã đăng xuất, tuyến đường đăng xuất sẽ chuyển hướng bạn đến root.
Logan Bailey

1

Một số giải pháp này quá phức tạp. Chỉ cần sử dụng Rails:

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

Trong UsersController, hãy làm như sau:

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

Sử dụng rails 3.2 và phát minh ra 3.2.3 Tôi quản lý để thiết lập trang chủ của mình " home # index " (controller # action) làm trang đăng nhập thực hiện các thay đổi sau.

# 1 Đã thêm biểu mẫu đă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 các phương thức resource_name, resource và devise_mapping vào app / holdpers / 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 ứng dụng điều khiển phiên tùy chỉnh / bộ điều khiển / người dùng / phiên_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 phiên và thiết lập bộ điều khiển phiên tùy chỉnh trong config / route.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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.