0

我已经尝试了几个小时了。我对 Ruby 和 Rails 很陌生。

在 devise.html.erb 文件中,我有

<div class="container">
<%= render :partial => 'layouts/header' if user_signed_in? %>
</div>

以上工作正常。如果用户已经登录,那么他们可以看到我页面顶部的标题,如果他们没有登录,他们就看不到它。

但我需要(因为用户必须在下一页输入地址):

 <div class="container">
<%= render :partial => 'layouts/header' if current_user.registration_complete?  %>

当我重新启动我的应用程序时,我收到错误消息:

NoMethodError in Devise/registrations#new

我在我的项目其他地方的 user.rb 中定义了 registration_complete (我的项目的其他部分没有问题识别)为:

#Determines whether user completed his profile on registration or not
 def registration_complete?
self.address.present?
 end

我应该在其他地方放置此代码,以便在我的 devise.html.erb 中识别它吗?

4

4 回答 4

2

NoMethodError in Devise/registrations#new是因为——

考虑一下:

<div class="container">
<%= render :partial => 'layouts/header' if current_user.registration_complete?  %>

上面的current_user代码是nil因为注册页面的用户没有登录。

nilregistration_complete也没有方法。

您还可以通过以下方式检查current_user代码中任何地方的存在;

if current_user
 #User is logged in
    <div class="container">
    <%= render :partial => 'layouts/header' if current_user.registration_complete?  %>
else
 #User is not logged in
 #Don't try current_user.registration_complete? check here..it will give error.
end

因此,只要您登录,您就可以将包含current_user.registration_complete?检查的代码放在应用程序的任何位置。

于 2013-03-06T15:06:08.383 回答
0

谢谢大家的帮助。如果没有像 Stackoverflow 这样的网站,我会迷路的!

最后,我结合使用了 Adbeel 和 Jesper 的解决方案,这似乎可以完成这项工作。

我用了:

<div class="container">
<%= render :partial => 'layouts/header' if user_signed_in? && current_user.registration_complete?%>
</div>

正如我所说,它运作良好,但如果您认为前方潜伏着一些我不知道的灾难,如果您能告诉我,我将不胜感激!再次感谢。

克里斯托夫。

于 2013-03-07T11:25:19.033 回答
0

正如 Saurabh Jain 已经指出的那样,您的 current_user 有时会为零,因此您必须以某种方式处理它。

他的 if 语句current_user是处理它的好方法。

另一种结构化的方法是将确定用户是否看到标题的所有逻辑放入辅助方法中,或者甚至更好地放入演示者中(例如,参见draper)。

在控制器中,我还要确保这里始终存在一个用户对象。如果没有用户登录,我将创建一个新的 User 对象作为虚拟对象。这样一来,讨厌的 nil 问题就会减少。

例如:

# In your controller
@user = current_user || User.new

# In a helper
def can_see_header? (user)
  user_signed_in? and user.registration_complete?
end

# In view
<div class="container">
  <% if can_see_header? @user %>
    <%= render "layouts/header" %>
  <% end %>
</div>

仅当您想要传递其他选项时,才需要渲染调用中的:partial键,至少在 Rails 的更高版本中是这样。

于 2013-03-06T15:16:25.977 回答
0

关于什么:

<%= render :partial => 'layouts/header' if current_user && current_user.registration_complete?  %>
于 2013-03-06T15:06:49.693 回答