如何通过用户创建新帖子?

时间:2013-03-04 08:37:39

标签: ruby-on-rails ruby-on-rails-3

我有以下用户和职位关系:

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>

3 个答案:

答案 0 :(得分:2)

ActiveRecord关系中wherefind之间存在差异。

查询:

@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的用户(只有一条记录)然后你可以使用它:

@user.posts

以上内容将为id为1的用户提供相关帖子。

然后你可以这样做:

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

所以你要做的实际上是给你哈希(用户集),但实际上你只想让一个用户创建相关的帖子。

另请参阅difference between find and where

答案 1 :(得分:0)

您的代码

User.where(:id => 1)

不会为您提供模型实例,而是relation。因此,ActiveRecord :: 关系上的NoMethodError

将第一行更改为

User.find(1)

你没事。

答案 2 :(得分: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")