【问题标题】:"has_many through" is breaking user post creation“has_many through”正在破坏用户帖子的创建
【发布时间】:2014-12-29 21:51:18
【问题描述】:

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

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 行,它会起作用:用户信息显示出来,一切都很好。但显然 Looks 功能不起作用。

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

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

编辑:

澄清一下,如果我有has_many :posts, through :looks,则 user_id 不会包含在帖子创建中

【问题讨论】:

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


    【解决方案1】:

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

    在您的设置中,用户与帖子的关联会经过查看。这意味着帖子没有直接发送给用户的外键。这个外键是user_id 属性。

    当您尝试使用current_user.posts.build(post_params) 构建帖子时,它假定没有user_id,因为该关联正在查看。这就是它不为user_id 赋值的原因。

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

    我建议reading morehas_many :through 关联。祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 2014-06-03
      • 1970-01-01
      相关资源
      最近更新 更多