[英]Rails 3, only rendering partial if a user is logged in
在 Rails 3.1 应用程序上,我有一个名为user_logged_in?
来自 Devise,我想用它来选择性地渲染部分。 这是 layouts/application.html.erb 中的代码:
<% if user_logged_in? %>
<%= render :partial => "home/statusbar" %>
<% end %>
它使用来自不同 controller 的部分。 这是部分:
<div id="status_bar">
Signed in as <%= link_to current_user.name, edit_user_registration_path %>
</div>
current_user.name
(未定义的方法)发生错误,因为current_user
为nil
。 我可以移动user_logged_in?
检查部分内部,但我认为如果它在视图中会稍微更有效率。
您能否指导我了解最佳实践是什么,或者我如何克服未定义的方法错误? Rails 检查模板的代码是否正常,即使它位于失败的if
块中?
它看起来像user_logged_in?
是哪里出了问题。如果你改变它,它会起作用吗?
<% if current_user.present? %>
<%= render :partial => "home/statusbar" %>
<% end %>
我熟悉 Devise,但不熟悉user_logged_in?
方法 - 你自己定义的吗? 视图中使用的普通助手是user_signed_in?
. 另外,请尝试以下操作:
<% puts user_logged_in?.inspect %>
<% puts user_signed_in?.inspect %>
在您视图中的 if 语句上方,并检查您的日志以确保您的调用正确返回false
( user_signed_in?
也应该返回false
)。 您不应该在该部分中收到 nil 错误,除非它实际上正在呈现(意味着代码输入了 if 语句)。
我找到了解决方案,看来
user_logged_in?
不再使用,而是您需要使用
user_signed_in?
因此,使用您提供的代码应该可以工作:
<% if user_signed_in? %>
<%= render :partial => "home/statusbar" %>
<% end %>
这段代码为我呈现了一部分。
该代码正在运行,ruby 是鸭子类型和动态的,所有检查都在运行时进行。 所以你需要检查你的条件。 尝试
<% if false %>
<%= render :partial => "home/statusbar" %>
<% end %>
看看它是否仍然失败。 更好的解决方案是
<% if current_user %>
<%= render :partial => "home/statusbar" %>
<% end %>
我不熟悉 devise 但这应该可以工作因为如果没有人登录,当前用户将为零
有一个更短的方法来渲染你的部分有条件
<%= render(partial: "home/statusbar") if current_user.present? %>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.