1

Rails と sqlite を使用して新しいアプリを作成し、サーバーを起動してコントローラーのインデックス アクションに移動すると、レコードが作成されていない場合でも nil エラーがスローされません。しかし、mongoid で同じことを行い、index アクションに移動すると、nil:NilClass に対して未定義のメソッド「to_sym」が得られます。コントローラー インデックス アクションで、Message.all.to_aを使用しようとしましたが、エラーがまだスローされ、Message.all.entriesを試しましたが、エラーがまだ発生します。

たとえば、Mongoid-4 を使用して新しい Rails-4.1.0.rc1 アプリを作成しました。これは、github で mongoid マスターを指しており、アプリが * ruby​​ 2.1.0p0 *を使用しているためです。

次に、足場ジェネレーターを使用して、以下に示すように、フィールドが 1 つだけのモデルを作成しました。

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.allnil を返すことを意味します。メッセージ テーブルにレコードがありません。

編集

rails 4.1.0.rc1バージョンの問題のようです。Rails の安定したビルドで同じコードを試してください。

于 2014-03-17T00:05:44.977 に答える
1

このバグは、レール 4.1.0.rc1でうまく動作しないモンゴイド バグのようです。私がこれを知っているのは、同じ手順に従って 2 つの異なる Rails アプリを作成し、mongoid のバージョンを一定に保ち、つまり mongoid が習得すべきポイントだからです。次に、アプリにrails 4.0.4を使用し、別のアプリにrails 4.1.0.beta2を使用しました。どちらのアプリも期待どおりに機能しました。データベースにレコードがなくても、インデックス ページに移動してもエラーは発生しません。

したがって、解決策は以前のバージョンのレールにダウングレードすることです。

于 2014-03-17T13:28:06.273 に答える