2012-03-20 23 views
6

Làm cách nào để có thể chuyển sang chế độ xem chương trình của người dùng hiện tại trong ứng dụng Rails?Làm cách nào để chuyển sang chế độ xem chương trình của người dùng hiện tại trong Rails?

tôi muốn làm một cái gì đó giống như

authenticated :user do 
    root :to => "users#show" 
end 

nhưng làm thế nào để tôi vượt qua ID của người dùng hiện tại vào điều này?

Cảm ơn

+2

Chắc chắn có một cách quyến rũ để làm điều này trong Rails 4+ so với những gì được đề nghị. –

Trả lời

4

Làm việc sau đây cho tôi.

Trong routes.rb:

root to: 'users#current_user_home' 

Trong users_controller.rb:

def current_user_home 
    redirect_to current_user 
end 
1

Luôn là người dùng 'hiện tại' hoặc bất kỳ người dùng tùy ý nào?

Nếu đó là người dùng hiện tại, chỉ cần chuyển hướng tất cả đến cùng một trang (không chỉ định ID) và trong hành động điều khiển sẽ nhận người dùng hiện tại (từ phiên v.v.) và chuyển qua chế độ xem.

+0

Xin chào Michael, tôi hiểu những gì bạn đang nói, nhưng tôi nghĩ tôi đang bối rối khi tình hình của tôi phức tạp hơn một chút. Biết ơn nếu bạn có thể giúp tôi suy nghĩ điều này. Gốc của current_user phải là người dùng/hiển thị với ID của người dùng hiện tại. Người dùng chỉ có thể xem chế độ xem chương trình của riêng họ và không ai có thể xem. Trong trường hợp này, tôi có thể sửa đổi bộ điều khiển hiển thị thành '@user = current_user'. NHƯNG, tôi cũng có một mô hình quản trị và quản trị viên có thể xem tất cả lượt xem chương trình của người dùng. cách tốt nhất để xử lý này là gì? Với một điều kiện trong bộ điều khiển chương trình, hoặc cách tiếp cận khác? Cảm ơn những suy nghĩ của bạn. –

0

ID người dùng hiện tại không được nằm trong url, sẽ được lưu trữ trong phiên. Vì vậy, bạn không cần phải vượt qua nó để tuyến đường.

Edit: Sau khi đọc comment của bạn, tôi nghĩ bạn có thể xác định hành động khác như profile cho chương trình xem của người dùng hiện hành.

Hoặc ít hành động users/show của bạn, thêm một số mã như:

if current_user.is_admin? 
    @user = User.find params[:id] 
else 
    @user = current_user 
end 
+0

cảm ơn xdazz, tôi hiểu ý của bạn, nhưng tôi vẫn gặp sự cố khi hiển thị chế độ xem chương trình. Xem bình luận của tôi để MIchael dưới đây để biết thêm chi tiết. Sẽ đánh giá cao bất kỳ con trỏ. –

+0

@AndyHarvey Xem bản chỉnh sửa của tôi. – xdazz

+0

Cảm ơn xdazz, tôi đã xem giải pháp thứ hai của bạn. Nhưng trong tình huống của tôi, người dùng hiện tại có thể thấy các liên kết đến các hồ sơ người dùng khác. Hiện tại, nếu họ nhấp vào các liên kết đó, họ sẽ nhận được lỗi ủy quyền. Nếu tôi đặt @ user = current_user, sau đó nhấp vào liên kết đến những người dùng khác sẽ bắt nguồn từ hồ sơ người dùng hiện tại, điều này thật lạ. Một hành động hồ sơ có thể làm việc, mặc dù tôi đã hy vọng sẽ có một cách đơn giản hơn. Tôi sẽ cho nó nó một cơ hội. –

8

Tôi đã làm một before_filter nơi tôi kiểm tra xem request.path == root_path và nếu như vậy tôi chuyển hướng đến con đường mà nên là root sử dụng cụ thể. Tập tin root_path được đặt trong routes.rb không phải là gốc của người dùng cụ thể cho bất kỳ người dùng nào, do đó không có chuyển hướng vô hạn. Chỉ cần thực hiện flash.keep để làm cho tin nhắn flash của bạn tồn tại trong chuyển hướng.

CHỈNH SỬA: Đọc Q & A và nhận xét, cố gắng hiểu những gì bạn đã có và những gì bạn vẫn cần. Bạn có thành công thiết lập định tuyến để nhận được hành động show được hiển thị mà không cần :id trong URL không? Nếu có thể bạn cần một cái gì đó như thế này trong bộ điều khiển của bạn show hành động:

if params[:id].nil? # if there is no user id in params, show current one 
    @user = current_user 
else # if there is the user id in params just use it, 
    # maybe get 'authorization failed' 
    @user = User.find params[:id] 
end 
Các vấn đề liên quan