【问题标题】:undefined method `each' for nil:NilClass in RailsRails 中 nil:NilClass 的未定义方法“each”
【发布时间】:2015-06-25 02:10:37
【问题描述】:

我的 _header.html.erb 是

<header class="navbar navbar-fixed-top navbar-inverse">
      <div class="container">
        <%= link_to "Database Management", root_path, id: "logo" %>
        <nav>
          <ul class="nav navbar-nav navbar-right">
            <li><%= link_to "Home",   root_path %></li>
            <li class="dropdown">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown">
            SelectTable <b class="caret"></b>
            </a>
            <ul class="dropdown-menu">
            <% if $l == 1 %>
              <% for items in @selectedtable %>    
                <li><%= link_to items, currenttable_path %> </li> 
                    <% $gh = item %>
              <% end %>
            <% end %> 
            </ul>


            <li class="dropdown">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown">
            SelectDatabase <b class="caret"></b>
            </a>
            <ul class="dropdown-menu">
            <% for item in @selecteddatabase %>  
              <li><%= link_to item, currentdatabase_path %></li> 
                  <% $gy = item %>
            <% end %>
            </ul>
            <li><%= link_to "NewTable", newtable_path %></li>
            <li><%= link_to "NewDatabase", newdatabase_path %></li>
            <li><%= link_to "DeleteTable", deletetable_path %></li>
            <li><%= link_to "DeleteDatabase", deletedatabase_path %></li>
            <li><%= link_to "Connect", connect_path %></li>
            <li><%= link_to "Disconnect", disconnect_path %></li>
            <li><%= link_to "Administration", administration_path %></li>
            <li><%= link_to "Quit", quit_path %></li>
          </ul>
        </nav>
      </div>
</header>

application_controller.rb 是

require 'mysql2'
class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception
  $con = Mysql2::Client.new(host: "localhost", username: "root", password: "new_password", database: "mysql")
  def header
    rs = $con.query("SHOW databases")
    i = 0 
    for y in rs
    i = i + 1
    end
    c = 0
    @selecteddatabase = Array.new(i)
    for item in rs 
      @selecteddatabase[c] = item
      c = c + 1
    end

    if $l == 1
      ts = $con.query("SHOW tables")
      i = 0 
      for y in ts
        i = i + 1
      end
      k = 0 
      @selectedtable = Array.new(i)
      for items in ts do 
        @selectedtable[k] = items 
        k = k + 1
      end
    end
  end
end

application.html.erb 是

<!DOCTYPE html>
<html>
  <head>
    <title><%= full_title(yield(:title)) %></title>
    <%= stylesheet_link_tag 'application', media: 'all',
                                           'data-turbolinks-track' => true %>
    <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
    <%= csrf_meta_tags %>
    <%= render 'layouts/shim' %>

  </head>
  <body>
    <%= render 'layouts/header' %>
        <div class="container">
      <% flash.each do |message_type, message| %>
        <%= content_tag(:div, message, class: "alert alert-#{message_type}") %>
      <% end %>
      <%= yield %>
      <%= render 'layouts/footer' %>
      <%= debug(params) if Rails.env.development? %>
    </div>
  </body>
</html>

错误是

StatisPages#home 中的 NoMethodError

显示 /home/tamal/rails_project/DatabaseManagement_app/app/views/layouts/_header.html.erb 提出第 25 行的位置:

nil:NilClass 的未定义方法 `each'

提取的源代码(第 25 行附近):

23 24 25 26 27 28

  • 模板包含的痕迹:app/views/layouts/application.html.erb

    Rails.root:/home/tamal/rails_project/DatabaseManagement_app 应用程序跟踪 |框架跟踪 |全程跟踪

    app/views/layouts/_header.html.erb:25:in _app_views_layouts__header_html_erb___324107568__651057508' app/views/layouts/application.html.erb:13:in _app_views_layouts_application_html_erb__249465561_90094870'

    请求

  • 【问题讨论】:

      标签: html ruby-on-rails ruby


      【解决方案1】:

      您的控制器方法header 只会在您的应用程序收到路由到它的请求时被调用。但是,由于您在应用程序布局中呈现您的 _header.html.erb 部分,它将包含在 每个 请求中。在未调用 header 方法时,每次引用 @selecteddatabase@selectedtable 时,您都有可能获得 NoMethodError

      如果您希望标头按原样工作,则需要为 每个 请求定义这些变量。一种方法是使用before_filter:

      class ApplicationController < ActionController::Base
        # other stuff...
      
        before_filter :assign_header_variables
      
        def assign_header_variables
          # content of your original header method
          # ...
        end
      
        # more stuff...
      

      我重命名了该方法,使其看起来不像控制器操作。


      原始答案(错过了大局):

      @selectedtable 是有条件分配的,特别是在$l == 1 时。每次$l 不是 1 时都会出现此错误。

      【讨论】:

      • 为什么单击“SelectDatabase”时不显示下拉菜单。
      • 如果您的原始问题已解决,并且您遇到了一个新的、不相关的问题,您应该提出一个新问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-08
      • 2013-04-10
      相关资源
      最近更新 更多