2013-05-19 179 views
2

我很新的轨道&我一直在这个问题上停留了几个小时。我正在尝试显示用户喜欢的帖子和用户的实际帖子。Rails:显示用户喜欢的帖子和自己的帖子在同一页

用我目前的代码,我得到这个错误“未定义的方法标题为#”,它是从这一行中提取:“<%= link_to post.title,post%>”。

有人对我如何让这个工作有所了解吗? (下面更多的代码)

def show 
@user = User.find_by_username(params[:id]) 

if @user 
    @posts = @user.posts.all + @user.likes.all 
    render actions: :show 
    @likes = @user.likes.all 
else 
    render file: 'public/404', status: 404, formats: [:html] 
end 
end 

这是我的路线文件:

resources :likes, only: [:create, :destroy] 
resources :posts 

devise_scope :user do 
    get 'register', to: 'devise/registrations#new' 
    get 'edit', to: 'devise/registrations#edit' 
    get 'login', to: 'devise/sessions#new' 
    get 'logout', to: 'devise/sessions#destroy' 
end 

这里的 '秀' 的看法:

<% if @posts %> 
    <% @posts.each do |post| %> 
    <%= link_to post.title, post %> 
    <% end %> 
<% end %> 

<%=的link_to post.title,后期% > display <%= post.inspect%>“这里是结果

<Post id: 11, title: "testing123", user_id: 2, created_at: "2013-05-18 19:25:45", updated_at: "2013-05-18 19:25:45"> #<Like id: 23, post_id: 10, user_id: 2, created_at: "2013-05-18 21:39:17", updated_at: "2013-05-18 21:39:17"> 

它工作时,我只是用这个 - >@posts = @user.posts.all但是当我用这个问题开始 - >@posts = @user.posts.all + @user.likes.all

使我有“未定义的方法'称号'”的短信..

+0

你可以发布你的路由文件? –

+0

@derek_duncan刚刚添加了我的路线文件(编辑) – Jon

+0

你能否也显示视图在那一行? <%= link_to post.title,post%> – lis2

回答

2

你可能想添加一些用户模型...

class User < ActiveRecord::Base 

    has_many :likes 
    has_many :liked_posts, :through => :likes, :source => :post 

    ... 

end 

然后,在你的控制器,你可以做到这一点

@posts = @user.posts + @user.liked_posts 
+0

哇这个工作!仍然习惯于在轨道协会..谢谢! – Jon

+0

是的 - '源'往往是令人困惑的部分。这是您用于执行:through的连接模型中的'belongs_to'。在这种情况下,后关联是我们如何通过喜欢而不明确地称它为'帖子'(因为已经采用了)。 – Swards

0

它似乎@[email protected]不会返回Post相关的阵列或ActiveRelation。

如果假设一个Like对象有post_id属性,那么你可能要修改代码,例如:

@posts = @user.posts.all + @user.likes.map(&:post)

+0

我觉得这是使用post.inspect方法后的问题,但现在我得到这个错误“未定义的方法'职位'为#<像... ...”使用你的方法(仍然使用post.inspect来检查它) – Jon

+0

你的'Like'类是什么样的? –

+1

很可能@ user.likes.map(&:post)(不是'posts') – Swards

1

我认为在活动记录它会快于使用红宝石地图

@posts = Post.joins("left join likes on likes.post_id = posts.id"). 
where("posts.user_id ? OR likes.user_id = ?", @user.id, @user.id) 

可能会更好,会在后期模型来定义范围

scope :owned_or_liked_by, ->(user) { joins("left join likes on likes.post_id = posts.id"). 
where("posts.user_id ? OR likes.user_id = ?", user.id, user.id) } 

然后你就可以使用

@posts = Post.owned_or_liked_by(@user) 

其他解决方案也将工作,但你产生一个SQL查询,它会更快,当你将有数据的大量量。

+0

编辑,不知道为什么我开始考虑照片:) – lis2

+0

是的,会有大量的帖子。所以我会试试这个,因为我希望它是轻快的 – Jon

+0

太棒了,请让我知道它是否有效,但仍然有机会我没有犯错误) – lis2

0

这是另一种方法,你可以采取,这是一种将其放入一个查询中并进行排序。如果你想把它全部包含在一个列表中。

class Post < ActiveRecord::Base 

    def self.visible_to(user) 
    where('posts.user_id = :user_id or likes.user_id = :user_id', { :user_id => user.id}).includes(:likes).order('created_at desc') 
    end 

end 

然后在控制器,你会做

@posts = Post.visible_to(@user) 
+0

这看起来更清洁和更轻,但不是它把这个错误“错误的参数数量(1为0)” – Jon

+0

我删除了“sort('created_at desc')”,现在它工作。谢谢。一个简单的问题 - 如果按照他们喜欢的方式排序,而不是创建它们时,是否可行? (例如,帖子是在5天前创建的,我喜欢,现在它显示在我今天早些时候发布的帖子前) – Jon

+0

对不起,应该是'订购'。 'sort'是一个数组方法,而order是用于活动记录的。由孩子排序有点棘手,有潜在的唯一性问题,但你可以尝试顺序('likes.created_at')。您也可以尝试使用has_many through方法进行排序。做一个额外的关联。 has_many:sorted_likes:class_name =>'Like',:order =>'likes.created_at'。然后做has_many:sorted_liked_posts:through =>:sorted_likes,:source =>:post。 – Swards

相关问题