2013-03-06 102 views
0

我一直在努力,现在几个小时做到这一点。我对Ruby和Rails很新。Ruby on 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的认可?

+1

给我们NoMethodError的完整错误。就像这样,我们看不到它来自哪里(尽管我假设它来自'registration_complete?'的调用?' – Jesper 2013-03-06 15:03:15

+0

'NoMethodError' ...什么?没有可用的方法?(我猜它抱怨'current_user') – Chowlett 2013-03-06 15:03:30

回答

2

NoMethodError in Devise/registrations#new是因为 -

考虑一下:

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

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

所以registration_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?检查应用程序中的任何地方提供的代码,您在登录

0

什么:

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

由于SAURABH耆那已经指出的那样,你的CURRENT_USER有时候会是零,所以你必须以某种方式处理。

他的if语句为current_user是把它处理好办法。

构建这个的另一种方法是将所有逻辑都确定为用户是将头部看成辅助方法,还是更好地将其视为演示者(例如,参见draper)。

在控制器中,我也将确保在这里始终是一个用户对象存在。如果没有用户登录,我将创建一个新的用户对象作为虚拟。这样就不会有那么讨厌的无问题了。

例如:

# 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键,当你想通过其他选项,至少在以后的版本电源轨的时候才需要。

0

感谢您的帮助,每一个。如果没有像Stackoverflow这样的网站,我会迷路!

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

我用:

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

正如我所说的,它工作得很好,但如果你认为有一些灾难潜伏未来我不知道,我会很感激,如果你让我知道!再次感谢。

Christophe。