我有以下型号:
Post.rb
has_many :likes
belongs_to :user
Like.rb
belongs_to :user
belongs_to :post
User.rb
has_many :posts
has_many :likes
我试图在视图中查询用户喜欢这样的内容:
<% @user.likes.each do |i| %>
<%= i.post.title %>
<% end %>
并返回未定义的方法&#39; title&#39;为零:NilClass
我只能达到这样的帖子数组:
<% @user.likes.each do |i| %>
<%= i.post %>
<% end %>
或者像这样<%= @user.likes.first.post.title %>
我无法理解为什么我无法达到&#34;标题&#34;或任何其他财产。
任何帮助?
答案 0 :(得分:3)
似乎@user.likes
中至少有一个没有关联的帖子。因此,Like#post
会返回nil
,并且会在nil
个对象上尝试调用title
,这会引发错误。如果不需要这种情况,您可能需要验证相似内容,以便每个Like
都有post
:
class Like < ActiveRecord::Base
# ...
validate :post, presence: true
如果是这样,你可能还应该确保在帖子被销毁时销毁相关的喜欢:
class Post < ActiveRecord::Base
# ...
has_many :likes, dependent: :destroy
你也可以只使用相关的帖子来获取喜欢这样的内容:
<% @user.likes.joins(:post).each do |i| %>
或在视图中使用try
,以便在没有发布帖子时,不会出现错误:
<%= i.post.try(:title) %>
答案 1 :(得分:0)
如果您的喜欢始终属于帖子,那么最好使用“通过::帖子”选项与赞建立用户关联。在这种情况下,这是正确的关联方式。
所以你的代码如下:
Post.rb
has_many :likes
belongs_to :user
Like.rb
belongs_to :post
User.rb
has_many :posts
has_many :likes, through: :posts
然后您可以访问用户的喜欢:
<% @user.likes.each do |i| %>
<%= i.post.title %>
<% end %>
其中包含帖子标题。