我一直试图这样做几个小时。我是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
我在我的项目的其他地方定义了registration_complete,在user.rb中(我的项目的其他部分没有识别),因为:
#Determines whether user completed his profile on registration or not
def registration_complete?
self.address.present?
end
我是否应该在其他地方放置此代码,以便在我的devise.html.erb中识别它?
答案 0 :(得分:2)
NoMethodError in Devise/registrations#new
是因为 -
考虑一下:
<div class="container">
<%= render :partial => 'layouts/header' if current_user.registration_complete? %>
上述代码中的current_user
为nil
,因为对于注册页面,用户未登录。
所以registration_complete
不是nil的方法。
您还可以通过以下方式检查代码中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?
的代码放在应用程序的任何位置。
答案 1 :(得分:0)
怎么样:
<%= render :partial => 'layouts/header' if current_user && current_user.registration_complete? %>
答案 2 :(得分:0)
正如Saurabh Jain已经指出的那样,你的current_user有时会为零,所以你必须以某种方式处理它。
他对current_user
的if语句是处理它的好方法。
另一种构造方法是将所有逻辑确定为用户是否将标题视为辅助方法,或者更好地将其视为演示者(请参阅例如draper)。
在控制器中,我还要确保此处始终存在用户对象。如果没有用户登录,我将创建一个新的User对象作为虚拟对象。这样就会减少讨厌的零问题。
例如:
# 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的更高版本中是这样。
答案 3 :(得分:0)
感谢您的帮助。没有像Stackoverflow这样的网站,我会迷失方向!
最后,我使用了Adbeel和Jesper的解决方案,这似乎可以完成这项工作。
我用过:
<div class="container">
<%= render :partial => 'layouts/header' if user_signed_in? && current_user.registration_complete?%>
</div>
正如我所说,它运作良好,但如果你认为潜在的灾难潜伏在前面,我不知道,如果你让我知道,我将不胜感激!再次感谢。
克里斯托弗。