2011-07-21 28 views
5

Trên ứng dụng Rails 3.1, tôi có phương thức được gọi là user_logged_in? từ Devise, mà tôi muốn sử dụng để hiển thị một phần có chọn lọc. Đây là mã trong bố cục/application.html.erb:Rails 3, chỉ hiển thị một phần nếu người dùng đăng nhập

<% if user_logged_in? %> 
<%= render :partial => "home/statusbar" %> 
<% end %> 

Nó sử dụng một phần từ bộ điều khiển khác. Đây là một phần:

<div id="status_bar"> 
    Signed in as <%= link_to current_user.name, edit_user_registration_path %> 
</div> 

Một lỗi xảy ra ở current_user.name (phương pháp xác định), vì current_usernil. Tôi có thể di chuyển các kiểm tra user_logged_in? bên trong một phần, nhưng tôi nghĩ rằng nó sẽ có hiệu quả nhẹ hơn nếu nó được xem.

Bạn có thể hướng dẫn tôi những phương pháp hay nhất hay cách tôi có thể khắc phục lỗi phương pháp chưa xác định? Rails có kiểm tra mã của mẫu ngay cả khi nó nằm trong khối if không thành công?

Trả lời

13

Có vẻ như user_logged_in? là nơi có sự cố xảy ra. Làm như thế nào nếu bạn thay đổi điều này?

<% if current_user.present? %> 
    <%= render :partial => "home/statusbar" %> 
<% end %> 
+3

Vâng, đúng vậy. Nó cũng hoạt động nếu tôi sử dụng user_signed_in ?. Phương pháp hoàn toàn sai. Xin lỗi và cảm ơn! – joseph

1

Mã đó đang chạy, ruby ​​được nhập bằng vịt và động, tất cả các kiểm tra đều ở thời gian chạy. Vì vậy, bạn cần phải kiểm tra điều kiện của bạn. Hãy thử

<% if false %> 
    <%= render :partial => "home/statusbar" %> 
<% end %> 

và xem nếu nó không thành công. Một giải pháp bettter sẽ

<% if current_user %> 
    <%= render :partial => "home/statusbar" %> 
<% end %> 

Tôi không quen với devise nhưng điều này nên làm việc Kể từ khi người dùng hiện hành wil được nil nếu không ai được đăng nhập

+0

Bạn nói đúng, tôi đã định sử dụng user_signed_in, chứ không phải user_logged_in! Cảm ơn câu trả lời thông tin. – joseph

4

Tôi quen thuộc với lập mưu, nhưng không phải là phương pháp user_logged_in? - bạn đã tự định nghĩa nó chưa? Trình trợ giúp thông thường được sử dụng trong chế độ xem là user_signed_in?. Ngoài ra, hãy thử một cái gì đó như sau:

<% puts user_logged_in?.inspect %> 
<% puts user_signed_in?.inspect %> 

Phía trên câu lệnh if trong quan điểm của bạn, và kiểm tra các bản ghi của bạn để đảm bảo cuộc gọi của bạn đang trở lại một cách chính xác false (user_signed_in? cũng nên trở về false). Bạn không nên nhận được một lỗi nil trong phần đó trừ khi nó thực sự được trả lại (có nghĩa là mã đã nhập vào câu lệnh if).

0

Có một cách thậm chí ngắn hơn để làm cho bạn một phần với một điều kiện

<%= render(partial: "home/statusbar") if current_user.present? %> 
1

Tôi tìm thấy giải pháp, dường như

user_logged_in? 

là không được sử dụng nữa, và thay vào đó bạn cần phải sử dụng

user_signed_in? 

Vì vậy, với mã bạn đã cung cấp tính năng này sẽ hoạt động:

<% if user_signed_in? %> 
    <%= render :partial => "home/statusbar" %> 
<% end %> 

Mã này trả về một phần cho tôi.

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