2011-01-20 25 views
9

Cố gắng chuyển hướng người dùng đến trang 'trang chủ' được liên kết của họ sau khi đăng nhập thành công bằng cách đăng xuất ... điều này mang lại cho tôi một số vòng chuyển hướng vô tận (chắc chắn tôi đã thiết lập sai).Devise gem in Rails: tạo user_root_path

Bất kể, tôi đang tìm một cách tiếp cận tốt hơn ...

Devise's docs nhà nước: Sau khi ký trong một người sử dụng, xác nhận tài khoản hoặc cập nhật mật khẩu, lập mưu sẽ tìm kiếm một gốc scoped đường dẫn để chuyển hướng. Ví dụ: Đối với tài khoản :user, tài khoản sẽ sử dụng user_root_path nếu có, nếu không mặc định root_path sẽ là được sử dụng. Điều này có nghĩa rằng bạn cần phải thiết lập gốc bên tuyến đường của bạn: root :to => "home"

Tôi sorta một newbie ... làm thế nào để đi về tạo home_root_path này cho mỗi người dùng?

rDocs also mention:.

- (Object) after_sign_in_path_for (resource_or_scope)

Url mặc định sẽ được sử dụng sau khi đăng nhập này được sử dụng bởi tất cả các lập mưu điều khiển và bạn có thể ghi đè lên nó trong ApplicationController của bạn để cung cấp móc tùy chỉnh cho tài nguyên tùy chỉnh . Theo mặc định, trước tiên nó cố gắng tìm một resource_root_path, nếu không nó sẽ sử dụng đường dẫn gốc. Đối với một phạm vi sử dụng , bạn có thể xác định địa chỉ mặc định theo cách sau:

map.user_root '/users', :controller => 'users' # creates user_root_path 

map.namespace :user do |user| 
    user.root :controller => 'users' # creates user_root_path 
end 

nhưng những chỉ mang lại cho tôi undefined local variable or method bản đồ' cho #ActionDispatch :: Routing :: Mapper: ... `lỗi.

+1

Bạn đang sử dụng phiên bản đường ray nào? Các bit after_sign_in_path_for ở trên đang sử dụng cú pháp định tuyến đường ray 2.x. Nếu bạn đang sử dụng đường ray 3.x, thì chúng có thể gây ra sự cố. – encoded

Trả lời

6

Bạn có thể thử một cái gì đó như thế này:

application_controller.rb:

def after_sign_in_path_for(resource_or_scope) 
    # return home_page_path for user using current_user method 
end 
+0

Rick bắt nguồn từ câu trả lời của anh ấy. Xem bình luận của tôi dưới câu trả lời của Rick cho một bản ghi nhớ có thể. –

6

Dug xung quanh một chút để tìm ra điều tương tự. @ Câu trả lời polarblau là đúng,

def after_sign_in_path_for(resource_or_scope) 
    user_info_path(current_user) 
end 

nơi user_info_path là đường dẫn đến trang web mà bạn muốn hiển thị.

Ngoài ra, tôi sẽ cho phép điều này quay trở lại siêu chỉ trong trường hợp, mặc dù tôi không hoàn toàn chắc chắn nếu điều đó là cần thiết ...

def after_sign_in_path_for(resource) 
    if resource.is_a(User) 
    user_info_path(resource) 
    else 
    super 
    end 
end 
+0

Điều này làm việc cho tôi mặc dù tôi đã đổi nó thành resource.is_a? (Người dùng) –

+0

Cách tiếp cận này luôn đi theo cùng một đường dẫn, nhưng tôi phát hiện ra rằng nó cũng ghi đè khả năng tích hợp của Devise để trở lại đường dẫn sau khi hết thời gian chờ phiên . I E. Devise tự động lưu trữ 'session [: user_return_to]' khi đăng xuất, nhưng nếu bạn đặt 'after_sign_in_path_for' như được hiển thị ở đây, biến session đó sẽ bị bỏ qua. Sử dụng phương thức 'user_root' route như trong câu trả lời của SnapShot cho phép bạn thực hiện cả hai: đi đến vị trí' user_return_to' nếu được định nghĩa trong phiên, đi đến đường dẫn được định nghĩa là 'root_path'. –

22

Nếu bạn muốn chuyển hướng sử dụng một tuyến đường trong câu trả lời cho câu hỏi của bạn dưới đây:

làm thế nào để đi về tạo home_root_path này cho mỗi người dùng?

Điều này sẽ hoạt động nếu bạn đặt nó trong tệp cấu hình/tuyến đường của mình. Nó sẽ chuyển hướng người dùng đến bài viết # index sau (ví dụ) xác nhận thành công.

match 'user_root' => 'articles#index', as: :user_root 
+1

Trong Ruby 1.8, cú pháp có một chút khác biệt: ': as =>: user_root' – slothbear

+1

Tôi đã thử nó mà không có': as', và nó có vẻ hoạt động tương tự. Có lợi thế nào để bao gồm ': as' không? – slothbear

1

Tôi đã dành vài giờ cố gắng để có được những chức năng tương tự, và điều này là mã mà kết thúc làm việc cho tôi:

def after_sign_in_path_for(resource) 
    current_user 
end 

Nếu tôi từng thử current_user_path, tôi luôn luôn có undefined local variable or method current_user_path lỗi.

Ngoài ra, tôi đang sử dụng Rails 3.2.8 và Devise 2.1.2.

Hy vọng điều đó sẽ hữu ích.

1

Dựa trên câu trả lời @SnapShot, điều này phù hợp với tôi. Tôi đang sử dụng nhiều mô hình dự đoán, cố gắng chuyển hướng trở lại trang chỉnh sửa hồ sơ người dùng.

get 'user_root', to: redirect('/users/edit'), as: :user_root 
Các vấn đề liên quan