Ruby on rails定义变量



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

在一个device .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定义在我的项目的其他地方,在用户。Rb(我项目的其他部分没有问题识别)为:

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

是否有其他地方我应该把这段代码,所以它将被识别在我的设备。html.erb?

NoMethodError in Devise/registrations#new是因为-

考虑一下:

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

上面代码中的current_usernil,因为用户没有登录注册页面。

所以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?检查的代码放在你的应用程序的任何地方,只要你是登录的。

怎么样:

<%= render :partial => 'layouts/header' if current_user && current_user.registration_complete?  %>

正如Saurabh Jain已经指出的,你的current_user有时会为nil,所以你必须以某种方式处理它。

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

另一种构造方法是将决定用户是否看到标题的所有逻辑放入helper方法中,或者更好地放入演示器中(参见例如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的后续版本中是这样。

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

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

我使用

:

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

就像我说的,它工作得很好,但如果你认为有一些我不知道的灾难潜伏在前面,我会很感激你告诉我!再次感谢。

克利斯朵夫

.

最新更新