Ruby on rails 如果Desive的当前用户为零,则创建回退

Ruby on rails 如果Desive的当前用户为零,则创建回退,ruby-on-rails,authentication,devise,permissions,Ruby On Rails,Authentication,Devise,Permissions,我在我的应用程序中有一些实例,它们根据Deavise提供的当前用户执行操作。例如: 控制器 class PostsController < ApplicationController def like @post.liked_by current_user end end class PostsController

我在我的应用程序中有一些实例,它们根据Deavise提供的
当前用户执行操作。例如:

控制器

class PostsController < ApplicationController
  def like
    @post.liked_by current_user
  end
end
class PostsController
查看

...
<% if current_user.liked? post %>
  <%= link_to "Unlike", unlike_post_path(current_user.to_param, post), method: :put, remote: true %>
<% else %>
  <%= link_to "Like", like_post_path(current_user.to_param, post), method: :put, remote: true %>
<% end %>   
。。。

我的问题是,如果没有
当前用户
,那么我会得到一个NilClass错误。我知道在过滤之前的回调
:对用户进行身份验证
但想知道如果登录/未登录用户的操作在视图中仍然可见,那么最好的解决方案是什么。

Desive有一个帮助程序:

<% if user_signed_in? && current_user.liked?(post) %>
  ...
<% else %>
  ...
<% end %>   

...
...

如果未登录,则条件的第二部分将永远不会被计算,因此不会出现零错误。

您也可以尝试帮助当前用户,如下所示:

<% if !current_user.nil? && current_user.liked?(post) %>
...
<% else %>
...
<% end %>

...
...

我们基本上是告诉rails,如果当前用户不是nil,并且当前用户喜欢帖子,那么我们应该看到“不喜欢”按钮,否则我们会看到“喜欢”按钮。

您可以将其拆分为部分。一个用于登录用户,一个用于未登录用户,并相应地进行更改。这取决于您想做什么。例如,在
like
方法中,如果
当前用户不存在,可以传递可选参数。除非你分享你喜欢做的事情,否则这个问题是模糊的,并且将以意见为基础,所以我投票决定结束它。@jvnill我更新了我的问题,将条件中涉及的行为包括在内。这就是你要找的信息吗?啊,不是卡尔。如果您正在寻找修复问题中特定代码的方法,那么下面的答案将对您有所帮助。如果您正在寻找更一般的答案,恐怕您的问题可能不符合SO标准。由此我得到错误:
语法错误,意外的tIDENTIFIER,应为关键字“then”或“;”或“\n”…在?&&当前用户是否喜欢?post
在其周围添加括号?变量,试试看。否则语法就可以了。如果仍然存在问题,请将完整代码粘贴到问题中。不用担心。正是出于这个原因,在方法参数周围使用括号是首选做法-当存在多个条件或参数时,您需要小心使用它们。Ruby社区风格指南建议始终使用括号。这很有趣。在阅读《雄辩的Ruby》这本书时,他们实际上有一个章节,括号是可选的,但有时是禁止的。我想如果在条件语句中省略了它们,事情可能会被误解。