2013-03-04 3 views
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: "[email protected]", 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> 
+0

использование '@user = User.where (: идентификатор => 1) .first' – jvnill

+0

попытаться использовать @user = user.find_by_id (1) –

ответ

0

Ваш код

User.where(:id => 1) 

не дает вам экземпляр модели, но relation. Следовательно, NoMethodError на ActiveRecord :: Связь.

Измените первую строку

User.find(1) 

и все в порядке.

+0

Вот и все! Я соглашусь через 5 минут. – egidra

+0

См. Мой пересмотренный ответ: не используйте 'User.where ...' вообще, кроме 'User.find ...' – awendt

2

В отношениях ActiveRecord существует разница между where и find.

Запрос:

@user = User.where(:id => 1) дает ваш хэш массива.

Так что, когда вы делаете что-то вроде @user.posts для вышеуказанного запроса, он дает ошибку NoMethodError on ActiveRecord::Relation, так как нет такого сообщения, связанного с этим хэшем. Поэтому для того, чтобы превратить его в пользователя, идентификатор 1, вы делаете так:

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

или

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

И даст вам пользователя, чей идентификатор 1 (только одна запись) и то вы можете использовать это:

@user.posts 

выше будет давать связанные сообщения пользователя с идентификатором 1.

Тогда вы можете сделать:

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

Так что вы пытаетесь сделать, это на самом деле дает вам хэш (набор пользователей), но на самом деле вы хотите только один пользователь, чтобы создать соответствующую запись.

См. Также difference between find and where.

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") 
Смежные вопросы