2010-09-03 52 views

Trả lời

4

Tôi nghĩ rằng after_sign_in_path_for phương pháp trong lập mưu là những gì bạn đang tìm kiếm.

Xác định phương thức đó trong ApplicationController của bạn và nó sẽ vượt quá khả năng triển khai mặc định của Devise. Đây là những gì tài liệu chỉ định để làm.

chi tiết ở đây: http://rdoc.info/github/plataformatec/devise/master/Devise/Controllers/Helpers:after_sign_in_path_for

+0

Tôi quên đề cập đến trong Devise 1.0, chứ không phải 1.1. – Pablo

+0

after_sign_in_path_for hiện không được gọi trên 1.0.8. – Pablo

+0

Nhìn vào SessionsController của Devise, khi đăng nhập thành công, sign_in_and_redirect được gọi. Điều này chuyển hướng đến vị trí trước đó được lưu trữ trong phiên. Nếu không có vị trí được lưu trữ, sau đó after_sign_in_path_for được gọi. Người dùng có đăng nhập từ (hoặc qua) trang chủ không? Điều đó có thể giải thích tại sao nó luôn chuyển hướng trở lại đó. – Sidane

21

Rất có thể rằng người dùng của bạn đã được chuyển hướng trước khi after_sign_in_path được gọi. Điều này xảy ra nếu người dùng cố gắng truy cập trang được bảo vệ bằng xác thực trực tiếp. Điều này sẽ xảy ra mọi lúc nếu bạn có root_path ('/') được bảo vệ bằng xác thực.

Có một cuộc thảo luận về nhóm google về chủ đề này:

Các giải pháp nhanh chóng và dơ bẩn là ghi đè lên stored_location_for để luôn trở nil như vậy:

class ApplicationController < ActionController::Base 
... 

    private 
    def stored_location_for(resource_or_scope) 
    nil 
    end 

    def after_sign_in_path_for(resource_or_scope) 
    my_favorite_path 
    end 
end 
+1

Là một biến thể nhỏ về điều này, tôi chỉ trả về nil từ archive_location_for nếu nó khớp với '/' là tuyến mặc định của tôi. Bằng cách đó, họ sẽ chỉ truy cập after_sign_in_path nếu họ không cố gắng đi đến một nơi khác. Để làm điều đó, chỉ cần thay thế nil bằng "(location = super) == '/'? Nil: location". –

0

Giả sử bạn muốn hiển thị trang tổng quan của người dùng sau khi đăng nhập.

class HomesController < ApplicationController  
    def index 
     if current_user //returns nil if not logged in 
      @users = User.all 
      render :dashboard 
     end 
    end 

    def dashboard 
     @users = User.all 
    end 
end 

trong routes.rb:

root :to => 'homes#index' 

Nếu đã đăng nhập, nếu khối được nhập vào action index và dashboard.erb được trả lại. (đảm bảo khởi tạo tất cả các biến, được yêu cầu bởi dashboard.erb, trong if-block của bạn) Nếu không, đường ray sẽ hiển thị index.erb

Các vấn đề liên quan