2012-01-17 6 views
8

Tôi đang sử dụng Rails 3 và Devise để tạo một ứng dụng mà người dùng đến trang web và được hiển thị một trang chủ có chứa thông tin đăng nhập và biểu mẫu đăng ký. Trang này có bộ điều khiển riêng của mình ("trang chủ") vì vậy tuyến đường làRails 3 w/Devise: Cách đặt hai trang chủ riêng dựa trên việc người dùng có được xác thực hay không?

root :to => "homepage#index" 

Tôi muốn hiển thị một trang web khác nhau nếu người dùng đã đăng nhập. Điều này sẽ chiếm tới có điểm gốc để

root :to => "dashboard#index" 

Có cách nào để có tuyến đường có điều kiện trong routes.rb, điều đó có cho phép tôi kiểm tra xem người dùng có được xác thực trước khi định tuyến cho một trong những trang chủ đó không?

Tôi đã thử sử dụng mã sau nhưng nếu tôi không đăng nhập, hãy đề nghị tôi đăng nhập, vì vậy chỉ rõ ràng tuyến đường đầu tiên hoạt động.

authenticate :user do 
    root :to => "dashboard#index" 
end 
    root :to => "homepage#index" 

Ngoài ra, tôi muốn url trỏ đến www.example.com trong cả hai trường hợp, để www.example.com/dashboard/index và www.example.com/homepage/index không bao giờ xuất hiện trong trình duyệt.

Cảm ơn một triệu !!!

Trả lời

13

Hãy thử điều này, đó là đặc trưng cho Warden/Vạch mặc dù.

root to: "dashboard#index", constraints: lambda { |r| r.env["warden"].authenticate? } 
root to: "homepage#index" 
+0

Cảm ơn rất nhiều @Bradley, điều này đã giết chết tôi :) –

+0

Tôi làm như vậy, nhưng cả người dùng đã đăng nhập và người dùng chưa đăng nhập đã sử dụng dashboard # index –

+1

Cảnh báo: Thao tác này không hoạt động với Rails 4, bạn nhận được thông báo lỗi: 'Tên tuyến đường không hợp lệ, đã được sử dụng: 'root'' – Happynoff

5

Trong HomeController của bạn:

def index 
    if !user_signed_in? 
    redirect_to :controller=>'dashboard', :action => 'index' 
    end 
end 
+0

cảm ơn vì trả lời @negarnil. Vấn đề là, tôi đã thử tùy chọn này nhưng nó không viết lại url. Tôi muốn www.example.com trỏ đến cả hai trang để www.example.com/dashboard/index không bao giờ được hiển thị –

+0

Thử hiển thị: action => 'dashboard.html.erb. http://guides.rubyonrails.org/layouts_and_rendering.html#wrapping-it-up –

2

(chính xác cùng một câu hỏi đã trả lời ở đây: https://stackoverflow.com/a/16233831/930038 Thêm câu trả lời ở đây quá để tham khảo của người khác..)

Trong routes.rb của bạn:

authenticated do 
    root :to => 'dashboard#index' 
end 

root :to => 'homepage#index' 

này sẽ đảm bảo rằng root_url cho tất cả chứng thực người dùng là dashboard#index

Để bạn tham khảo: https://github.com/plataformatec/devise/pull/1147

+0

Trong Rails 4, thao tác này không hoạt động. Bạn phải đổi tên một trong hai Tuyến đường. Xem [answer] của tôi (http://stackoverflow.com/a/19090936/1836143). –

2

Dưới đây là câu trả lời đúng với đường ray 4

root to: 'dashboard#index', constraints: -> (r) { r.env["warden"].authenticate? }, 
     as: :authenticated_root 
root to: 'homepage#index' 

Tôi cố gắng để thêm video này vào/chỉnh sửa câu trả lời chấp nhận nhưng nó quá nhiều của một chỉnh sửa để được chấp nhận rõ ràng. Dù sao, bỏ phiếu cho câu trả lời được chấp nhận (từ Bradley), nó đã giúp tôi tìm ra câu trả lời này :)