当我使用rails和sqlite创建一个全新的应用程序并启动服务器和控制器的索引操作时,即使没有创建记录也不会抛出nil错误。但我和mongoid一起做同样的事情并导航到索引动作,我得到未定义的方法`to_sym&#39;为零:NilClass 。在控制器索引操作中,我尝试使用 Message.all.to_a ,但仍然抛出错误,我尝试了 Message.all.entries ,但仍然出现了错误。< / p>
对于我的实例,我使用Mongoid-4创建了一个新的Rails-4.1.0.rc1应用程序,因为我指向github上的mongoid master并且应用程序使用* ruby 2.1.0p0 * < / p>
然后我使用 scaffold 生成器创建一个只有一个字段的模型,如下所示:
rails g scaffold message body:text
现在当我启动 rails服务器并navaigate到** 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
答案 0 :(得分: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
设置为nil。这意味着Message.all
返回零。消息表中没有任何记录。
修改强>
这似乎是rails 4.1.0.rc1
版本中的一个问题。使用稳定版本的Rails尝试相同的代码。
答案 1 :(得分:1)
该错误似乎是一个mongoid错误,使其无法与 rails 4.1.0.rc1 一起使用。我知道这是因为按照相同的步骤创建了两个不同的rails应用程序,保持mongoid版本不变,即mongoid指向master。然后我使用 rails 4.0.4 作为应用程序, rails 4.1.0.beta2 作为另一个应用程序。这两个应用程序按预期工作,导航到索引页面即使数据库中没有记录也不会引发错误。
所以解决方案是降级到早期版本的rails。