2010-11-20 26 views
18

Tôi đang sử dụng thiết kế với đường ray 3 và tôi đang cố gắng tạo trang có thể được mọi người xem (ngay cả những người chưa đăng ký) nhưng có chức năng bổ sung cho những người đã đăng ký.Cách lấy người dùng hiện tại bằng cách sử dụng đường ray mà không sử dụng xác thực! trên bộ điều khiển

Vấn đề là khi tôi gọi current_user không có người dùng vì tôi chưa sử dụng xác thực! lọc trên bộ điều khiển của tôi, bởi vì tôi muốn người dùng chưa đăng ký có thể xem nó.

Làm cách nào để đăng nhập vào người dùng nếu họ đang ở trong phiên, nếu không thì sẽ không có người dùng?

+4

Nếu câu hỏi này vẫn hoạt động, Devise giờ đây luôn tải current_user cho bạn bất kể sử dụng authenticate_user! trước khi lọc hay không. – zykadelic

Trả lời

14

Bạn có thể sử dụng user_signed_in? để thêm chức năng bổ sung trong chế độ xem.

<% if user_signed_in? %> 
... for logged in users only and current_user is not nil here.... 
<% else %> 
... for anonymous users only and current_user is nil here.... 
<% end %> 
+2

Vâng, ngoại trừ user_signed_in? có thể đúng và current_user có thể là nil. Những gì tôi muốn làm là làm cho nó tải đối tượng current_user nếu ai đó đăng nhập nhưng không phải nếu họ không, và không yêu cầu người dùng phải được xác thực. –

0

Không để nitpick, nhưng nó có vẻ như cả hai làm việc ở các vị trí tương tự, nó chỉ là rằng current_user không được khởi tạo nếu không có người dùng được đăng nhập.

Dưới đây là một phế liệu của một dòng từ một ý tưởng có liên quan, đó là từ một before_filter đó cấm người dùng từ mục chỉnh sửa mà không thuộc về họ

user_signed_in? && (@subscription.user_id == current_user.id || current_user.admin) 

Bạn cần phải bọc toàn bộ bit với một && trên user_signed_in? mặc dù, hoặc nó sẽ sụp đổ khi không có người dùng là Signe d trong.

1

Cách duy nhất tôi có thể nghĩ để làm điều này là để gọi nó mọi lúc bạn muốn gọi người dùng hiện hành, mà có lẽ không phải là giải pháp tốt nhất ... nên nó sẽ là một cái gì đó giống như

if user_signed_in? 
#code for current_user 
else 
#code for no current_user object 
end 
1

Chỉ cần lưu ý nhanh. Tôi muốn tìm hiểu xem người dùng quản trị đã đăng nhập chưa và nếu có cung cấp một số liên kết hữu ích & thông tin trên trang xem công khai, vì vậy quản trị viên có thể nhanh chóng chuyển đến phần quản trị để chỉnh sửa tài nguyên.

Tuy nhiên nếu bạn tạo người dùng của mình làm Người dùng quản trị viên (làm theo hướng dẫn bắt đầu cho ActiveAdmin) thì phương pháp user_signed_in?current_useradmin_user_signed_in?current_admin_user.

Vì vậy, ví dụ như trong một cái nhìn nào để hiển thị một bài (views/bài viết/show.html.erb) Tôi có thể sử dụng (giản thể cho rõ ràng)

<div id='show_post_<%= @post.id %>'> 
    <h2><%= @post.title %></h2> 
    <div class='post_author'>by: <%= @post.author%></div> 
    <% if admin_user_signed_in? %> 
    <div class='admin_links'>Put links to admin pages for: 
     <%= current_admin_user.email %> 
    </div> 
    <% end %> 

    <div class='post_body'> 
     <%= raw @post.content %> 
    </div> 
</div> 

Tôi hy vọng rằng các tên phương pháp sẽ được tạo dựa trên bất kỳ thứ gì bạn đã sử dụng khi thiết lập người dùng trong ActiveAdmin hoặc Devise (nếu bạn đặt tên người dùng mẫu Vip của mình thì phương pháp sẽ là vip_signed_in?).

+0

cảm ơn vì điều này .. – baash05

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