我有一个论坛,我有帖子,用户和外观(外观控制帖子的读/未读状态):
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
答案 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
关联。祝你好运!