1

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

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

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

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
4

2 回答 2

2

用这个

<% 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设置为零。这意味着Message.all返回零。您在消息表中没有任何记录。

编辑

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

于 2014-03-17T00:05:44.977 回答
1

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

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

于 2014-03-17T13:28:06.273 回答