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

Posted

技术标签:

【中文标题】Rails 3,仅在用户登录时才呈现部分内容【英文标题】:Rails 3, only rendering partial if a user is logged in 【发布时间】:2011-07-21 23:08:05 【问题描述】:

在 Rails 3.1 应用程序中,我有一个来自 Devise 的名为 user_logged_in? 的方法,我想用它来选择性地渲染部分。这是 layouts/application.html.erb 中的代码:

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

它使用来自不同控制器的部分。这是部分:

<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 块中?

【问题讨论】:

【参考方案1】:

看起来user_logged_in? 出了点问题。如果你改成这个,它会起作用吗?

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

【讨论】:

是的,确实如此。如果我使用 user_signed_in? 它也有效。完全错误的方法。对不起,谢谢!【参考方案2】:

我熟悉 Devise,但不熟悉 user_logged_in? 方法 - 你自己定义了吗?视图中使用的普通助手是user_signed_in?。另外,请尝试以下操作:

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

在您视图中的 if 语句上方,并检查您的日志以确保您的调用正确返回 falseuser_signed_in? 也应该返回 false)。你不应该在那个部分得到一个 nil 错误,除非它实际上正在被渲染(意味着代码进入了 if 语句)。

【讨论】:

【参考方案3】:

该代码正在运行,ruby 是鸭子类型和动态的,所有检查都在运行时进行。所以你需要检查你的条件。试试

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

看看它是否仍然失败。 更好的解决方案是

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

我不熟悉设计,但这应该可以 因为如果没有人登录,当前用户将为 nil

【讨论】:

你说得对,我应该使用 user_signed_in,而不是 user_logged_in!感谢您提供信息丰富的答案。【参考方案4】:

我找到了解决办法,看来

user_logged_in?

不再使用,而是需要使用

user_signed_in?

所以你给出的代码应该可以工作:

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

这段代码为我呈现了一部分。

【讨论】:

【参考方案5】:

还有一种更短的方法可以用条件渲染你的局部

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

【讨论】:

以上是关于Rails 3,仅在用户登录时才呈现部分内容的主要内容,如果未能解决你的问题,请参考以下文章

Rails 在视图呈现后登录用户

仅在存在承载标头时才验证 JWT

Rails 3-在弹出窗口中的 ajax 调用上呈现部分内容

为啥 Angular Oninit 仅在离开页面时才调用服务

Facebook SDK 3.2 登录仅在应用程序未终止时才有效

仅在验证成功时渲染组件