1

私は次のユーザーと投稿の関係を持っています:

class User < ActiveRecord::Base
  attr_accessible :email, :password, :password_confirmation

  has_many :posts
end


class Post < ActiveRecord::Base
  attr_accessible :content

  belongs_to :user
end

ユーザーを介して新しい投稿を作成しようとしていますが、エラーが発生します。理由はわかりません:

1.9.3-p392 :001 > @user = User.where(:id => 1)
  User Load (0.1ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1
 => [#<User id: 1, email: "test@test.com", encrypted_password: "$2a$10$ltpBpN0gMzOGULVtMxqgueQHat1DLkY.Ino3E1QoO2nI...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 6, current_sign_in_at: "2013-03-04 05:33:46", last_sign_in_at: "2013-03-03 22:18:17", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", created_at: "2013-03-02 03:41:48", updated_at: "2013-03-04 05:33:46", avatar_file_name: nil, avatar_content_type: nil, avatar_file_size: nil, avatar_updated_at: nil>] 
1.9.3-p392 :002 > @user.posts.create(:content => "This is the content")
NoMethodError: undefined method `posts' for #<ActiveRecord::Relation:0x000000024ca868>
4

3 に答える 3

2

ActiveRecordリレーションシップwhereとの間には違いがあります。find

クエリ:

@user = User.where(:id => 1)配列ハッシュを与えています。

したがって@user.posts、上記のクエリのようなことを行うNoMethodError on ActiveRecord::Relationと、このハッシュに関連付けられたそのような投稿がないため、エラーが発生します。したがって、IDが1のユーザーに変換するには、次のようにします。

@user = User.where(:id => 1).first 

また

@user = User.find(:id => 1)

どちらもIDが1(1つのレコードのみ)のユーザーを提供し、次のように使用できます。

@user.posts

上記は、ID1のユーザーの関連する投稿を提供します。

次に、次のことができます。

@user.posts.create(:content => "Post of user 1")

つまり、あなたがやろうとしているのは、実際にはハッシュ(ユーザーのセット)を提供することですが、実際には1人のユーザーだけが関連する投稿を作成する必要があります。

また、findとwhereの違いを参照してください。

于 2013-03-04T09:05:01.190 に答える
0

これを使って

@user = User.where(:id => 1).shift
@user.posts.create(:content => "This is the content")

また

@user = User.find(1)
@user.posts.create(:content => "This is the content")
于 2013-03-04T09:51:05.070 に答える
0

あなたのコード

User.where(:id => 1)

モデル インスタンスではなくリレーションを提供します。したがって、NoMethodErroron ActiveRecord:: Relationです。

最初の行を次のように変更します

User.find(1)

そして元気です。

于 2013-03-04T08:45:17.923 に答える