【问题标题】:fresh Rails-4.1.0rc1 controller index throwing undefined method `to_sym' for nil:NilClass新鲜的 Rails-4.1.0rc1 控制器索引为 nil:NilClass 抛出未定义的方法 `to_sym'
【发布时间】:2014-03-16 23:47:17
【问题描述】:

当我使用 rails 和 sqlite 创建一个新的应用程序并启动服务器并执行控制器的索引操作时,即使没有创建记录,它也不会抛出 nil 错误。但是我对 mongoid 执行相同操作并导航到索引操作,我得到 undefined method `to_sym' for nil:NilClass。在控制器索引操作中,我尝试使用 Message.all.to_a 但仍然抛出错误,我尝试了 Message.all.entries 但仍然引发错误。

例如,我使用 Mongoid-4 创建了一个新的 Rails-4.1.0.rc1 应用程序,因为我指向 github 上的 mongoid master 并且该应用程序使用 *ruby 2.1.0p0 *

然后我使用 scaffold 生成器创建了一个只有一个字段的模型,如下所示:

rails g scaffold message body:text

现在,当我启动 rails 服务器 并导航到 **localhost:3000/messages 时,我得到:

ActionView::Template::Error (undefined method `to_sym' for nil:NilClass):
 9:   </thead>
10: 
11:   <tbody>
12:     <% @messages.each do |message| %>
13:       <tr>
14:         <td><%= message.body %></td>
15:         <td><%= link_to 'Show', message %></td>
app/views/messages/index.html.erb:12:in     `_app_views_messages_index_html_erb__250078575__604951838'

这里是 index.html.erb:

  <% @messages.each do |message| %>
  <tr>
    <td><%= message.body %></td>
    <td><%= link_to 'Show', message %></td>
    <td><%= link_to 'Edit', edit_message_path(message) %></td>
    <td><%= link_to 'Destroy', message, method: :delete, data: { confirm: 'Are you sure?' } %></td>
  </tr>
<% end %>

这是模型

class Message
  include Mongoid::Document
  field :body, type: String
end

控制器:

 class MessagesController < ApplicationController

   def index
      @messages = Message.all
   end
 end

路线

resources :messages

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 mongoid mongoid4


    【解决方案1】:

    使用这个

    <% unless @messages.nil? %>
    <% @messages.each do |message| %>
      <tr>
        <td><%= message.body %></td>
        <td><%= link_to 'Show', message %></td>
        <td><%= link_to 'Edit', edit_message_path(message) %></td>
        <td><%= link_to 'Destroy', message, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
    <% end %>
    

    @messages 似乎设置为 nil。这意味着 Message.all 返回 nil。您在消息表中没有任何记录。

    编辑

    这似乎是rails 4.1.0.rc1 版本中的一个问题。尝试使用稳定的 Rails 构建相同的代码。

    【讨论】:

    • 感谢@Kirti。我添加了 unless nil 块,如您的代码中所示,但它抛出了相同的旧错误。就像我在我的问题中提到的,如果您使用 rails 和 activerecord* 而不是 mongoid 重复这个脚手架过程,您可以在不添加 unless nil 块的情况下转到索引,这让我觉得这里可能有别的东西在起作用。
    【解决方案2】:

    该错误似乎是一个 mongoid 错误,使其无法与 rails 4.1.0.rc1 一起正常工作。我知道这一点是因为按照相同的步骤创建了两个不同的 rails 应用程序,保持 mongoid 版本不变,即 mongoid 指向 master。然后,我将 rails 4.0.4 用于一个应用程序,将 rails 4.1.0.beta2 用于另一个应用程序。两个应用程序都按预期工作,即即使数据库中没有记录,导航到索引页面也不会引发错误。

    所以解决方案是降级到早期版本的 rails。

    【讨论】:

    • +1 我正要提出同样的建议。很高兴你知道了。
    • 也感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    相关资源
    最近更新 更多