2012-02-10 23 views
17

Với mô-đun Xác nhận được bật, Devise sẽ không cho phép người dùng chưa được xác nhận đăng nhập sau một khoảng thời gian được xác định trước. Thay vào đó, người dùng được chuyển hướng trở lại trang đăng nhập bằng thông báo flash "Bạn phải xác nhận tài khoản của mình trước khi tiếp tục".Phát triển với Xác nhận - Chuyển hướng người dùng đến trang tùy chỉnh khi người dùng cố gắng đăng nhập bằng email chưa được xác nhận

Đây là mô hình tương tác không mong muốn, vì thông báo flash không cung cấp đủ không gian để giải thích đúng cách cho người dùng tại sao quyền truy cập bị từ chối, "xác nhận tài khoản của bạn" nghĩa là gì, cung cấp liên kết để gửi lại xác nhận và hướng dẫn về cách kiểm tra thư mục spam của bạn và v.v.

Có cách nào để thay đổi hành vi này để chuyển hướng đến một URL cụ thể không?

Trả lời

27

Xin lỗi lúc đầu tôi nghĩ bạn có nghĩa là sau khi Đăng ký không đăng nhập. Vì vậy, xuống dưới làm việc cho làm thế nào để hướng người dùng sau khi Đăng ký và những gì bạn cần làm để đăng nhập là tạo ra một tùy chỉnh Vạch :: FailureApp

Xem trang wiki: https://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-when-the-user-can-not-be-authenticated

Sau đó, trong tùy chỉnh của bạn FailureApp ghi đè lên redirect_url phương pháp từ https://github.com/plataformatec/devise/blob/master/lib/devise/failure_app.rb:

def redirect_url 
    if warden_message == :unconfirmed 
     custom_redirect_path 
    else 
     super 
    end 
    end 

Đối với chuyển hướng tùy chỉnh sau Đăng ký:

có một phương pháp điều khiển after_inactive_sign_up_path_for trong RegistrationsContro mà bạn có thể ghi đè để thực hiện điều này.

đầu tiên trong tuyến đường của bạn, bạn sẽ cần phải xác định để sử dụng điều khiển tùy chỉnh của bạn:

config/routes.rb:

devise_for :users, :controllers => { :registrations => "users/registrations" } 

Thứ hai bạn tạo bộ điều khiển tùy chỉnh của bạn mà được thừa hưởng từ bộ điều khiển bình thường để ghi đè lên phương pháp :

app/controllers/users/registrations_controller.rb

class Users::RegistrationsController < Devise::RegistrationsController 

    protected 

    def after_inactive_sign_up_path_for(resource) 
    signed_up_path 
    end 

end 

Trong trường hợp này đối với ứng dụng của tôi, mô hình Devise của tôi là Người dùng, do đó bạn có thể muốn thay đổi không gian tên đó nếu mô hình của bạn được đặt tên khác. Tôi muốn người dùng của mình được chuyển hướng đến signed_up_path, nhưng bạn có thể thay đổi điều đó thành đường dẫn mong muốn của mình.

9

Tôi chỉ làm điều này, nhưng đã có cách tiếp cận khác.

trong app/controllers/sessions_controller.rb:

class SessionsController < Devise::SessionsController 

    before_filter :check_user_confirmation, only: :create 

    # 
    # other code here not relevant to the example 
    # 

private 

    def check_user_confirmation 
    user = User.find_by_email(params[:email]) 
    redirect_to new_confirmation_path(:user) unless user && user.confirmed? 
    end 
end 

này làm việc cho tôi và dường như xâm lấn tối thiểu. Trong các phiên mới, ứng dụng của tôi luôn phải trải qua sessions#create và người dùng luôn đăng nhập bằng địa chỉ email của họ, vì vậy đây có thể là trường hợp đơn giản hơn của bạn.

Bạn có thể khóa học redirect_to bất kỳ vị trí nào bạn muốn trong phương thức check_user_confirmation. new_confirmation_path là lựa chọn hợp lý đối với tôi vì nó cung cấp cho người dùng các tài nguyên để được xác nhận.

+0

Một câu hỏi: làm thế nào tôi có thể tìm thấy những tài khi ông có thể đăng nhập với Tên truy nhập hoặc email? Vì vậy, bạn nhận được ': login' như tham số, có thể là email người dùng hoặc tên người dùng. – jonhue

0

Đây là giải pháp của tôi mà bạn cần phải thêm: thông báo chưa được xác nhận về cách tạo ngôn ngữ bên dưới các phiên.

trong app/controllers/sessions_controller.rb

def check_user_confirmation 
    user = User.where(email: params[:user][:email]).take 

    unless user && user.confirmed? 
     set_flash_message! :alert, :unconfirmed 
     expire_data_after_sign_in! 
     respond_with user, location: after_inactive_sign_up_path_for(user) 
    end 
    end 

    protected 

    def after_inactive_sign_up_path_for(resource) 
    new_user_session_path 
    end 
Các vấn đề liên quan