【问题标题】:ruby on rails defining variablesruby on rails 定义变量
【发布时间】:2013-02-21 10:40:28
【问题描述】:

我已经尝试了几个小时了。我对 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 中识别它?

【问题讨论】:

  • 向我们提供 NoMethodError 的完整错误。就像它一样,我们看不到它来自哪里(尽管我假设它来自对registration_complete?的调用@
  • NoMethodError... 什么?什么方法不可用? (我猜它在抱怨current_user

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    怎么样:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        我用过:

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

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

        克里斯托夫。

        【讨论】:

          猜你喜欢
          • 2013-11-27
          • 1970-01-01
          • 2012-12-28
          • 2012-09-24
          • 1970-01-01
          • 2018-05-05
          • 2017-01-26
          • 2017-10-11
          • 1970-01-01
          相关资源
          最近更新 更多