5

この原因不明のActiveRecord::Relationship、未定義のメソッドエラーが発生しています。モデルの関連付けが明確に定義されており、イベントテーブルにユーザーテーブルの外部キーがあるため、理由はわかりません。この修正を使用しようとしましたが、失敗しました:Rails 3 ActiveRecord::Relationランダムアソシエーションの動作

event.rb

class Event < ActiveRecord::Base
  belongs_to :user

  attr_accessible :event_name, :Starts_at, :finish, :tracks
end

user.rb

class User < ActiveRecord::Base
  has_many :events, :dependent => :destroy

  attr_accessible :name, :event_attributes

  accepts_nested_attributes_for :events,  :allow_destroy => true

end

schema.rb

ActiveRecord::Schema.define(:version => 20101201180355) do

  create_table "events", :force => true do |t|

    t.string   "event_name"
    t.string   "tracks"
    t.datetime "starts_at"
    t.datetime "finish"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "user_id"
  end
end

エラーメッセージ

NoMethodError in Users#index 
undefined method `events' for #<ActiveRecord::Relation:0x4177518>

Extracted source (around line #10):

7:  <th><%= sortable "Tracks" %></th>

8:   </tr>


10:  <% @users.events.each do |event| %> 

11: <% debugger %> 

12:   <tr>

13:     <td><%= event.starts_at %></td>

Trace of template inclusion: app/views/users/index.html.erb

Rails.root: C:/rails_project1/events_manager
Application Trace | Framework Trace | Full Trace

app/views/users/_event_user.html.erb:10:in `_app_views_users__event_user_html_erb__412443848_34308540_1390678'
app/views/users/index.html.erb:7:in `_app_views_users_index_html_erb___603337143_34316016_0'
4

2 に答える 2

8

エラー メッセージをよく読むと、イベントとの関係に問題があるとは言えません。それは言います:

未定義のメソッド「events」

10: <% @users.events.each do |イベント| %>

私も最初にぶつかったとき、これを理解するのに苦労しました

これは、@users のファインダーが、予期したユーザー リスト (または適切な名前のないオブジェクト) ではなく、Relation オブジェクトを返していることを意味します。

どこでも検索を使用している場合は、「where(:id => ...).first」に変更する必要があります。

たとえば、コントローラーにはおそらく次のようなものがあります。

@users = User.find(<conditions go here>)

これは次のように変更する必要があります。

@users = User.where(<conditions go here>).all

または、結果の関係オブジェクトを「where」の後に使用して、追加の条件と sql の「構成」を使用することもできます。

@users = User.where(:admin => true).where('created_at > ?', min_date).order('created_at').limit(10).all

リレーション オブジェクトは、「.first」、「.all」、「.each」または「.inspect」が呼び出された場合にのみクエリを実行します。

于 2011-01-03T20:53:35.057 に答える
5

1 つ userは多くのevents. あなたのコードでは、おそらく複数のユーザーであるeventsonにアクセスしようとしているようです。@users

あなたはおそらく次のようなことをしたいと思うでしょう:

@users.each do |user|
  user.events.each do |event|
    ...
  end
end

また:

 @user.map(&:events).flatten.each do |event|
   ...
 end

attr_accessibleさらに、データベースの列である属性を指定する必要はありません。

于 2010-12-28T15:42:41.240 に答える