“has_many through”正在打破用户帖子创建

时间:2014-12-29 21:51:19

标签: ruby-on-rails ruby-on-rails-4 haml

我有一个论坛,我有帖子,用户和外观(外观控制帖子的读/未读状态):

class User
  has_many :posts, through: :looks
  has_many :comments
  has_many :looks
end

class Post
  belongs_to :user
  has_many :looks
  has_many :users, through: :looks
end

class Look
  belongs_to :post
  belongs_to :user
end

这是posts_controller:

def create
  @post = current_user.posts.build(post_params)

  if @post.save
    redirect_to @post
  else
    render 'new'
  end
end

最后haml:

- unless @post.user.blank?
    .profileImage{:style => "background: url(#{@post.user.image_url)}"}
    %span.userName= @post.user.username
    %span.userTitle= @post.user.custom_title
    %span.userCount
      = @post.user.posts.count + @post.user.posts.count
      posts

问题是用户模型中的行through :looks导致用户属性在创建时未保存到帖子中。帖子用户似乎是空白的。即使我删除through :looks行并刷新,用户信息也不会显示。

如果我删除它有效的through :looks行:用户信息显示,一切都很好。但显然,外观功能并不起作用。

另外,如果我删除- unless @post.user.blank?,我会得到undefined method image_url  尝试创建帖子时出错。

如何使through :looks能够使用我当前的设置?

编辑:

为了澄清,如果我有has_many :posts, through :looks

,那么user_id不会包含在帖子创建中

1 个答案:

答案 0 :(得分:1)

您错误地使用了has_many :through关联。

在您的设置中,用户与帖子的关联会进行查看。这意味着帖子没有直接指向用户的外键。此外键将是user_id属性。

当您尝试使用current_user.posts.build(post_params)构建帖子时,它假设没有user_id,因为关联正在进行查看。这就是为什么它没有为user_id赋值。

当您删除:through选项时,它会查找要分配的user_id,因为这是直接关联。如果您想坚持使用through选项,则可以从belongs_to :user模型中删除Post,从user_id迁移中删除Post

我建议reading more关于has_many :through关联。祝你好运!