ruby on rails定义变量

时间:2013-03-06 15:01:25

标签: ruby-on-rails ruby variables private public

我一直试图这样做几个小时。我是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中识别它?

4 个答案:

答案 0 :(得分:2)

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?的代码放在应用程序的任何位置。

答案 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>

正如我所说,它运作良好,但如果你认为潜在的灾难潜伏在前面,我不知道,如果你让我知道,我将不胜感激!再次感谢。

克里斯托弗。