繁体   English   中英

Rails 3,仅在用户登录时才呈现部分内容

[英]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_usernil 我可以移动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 语句上方,并检查您的日志以确保您的调用正确返回falseuser_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM