Rails:显示用户喜欢的帖子&在同一页面上拥有自己的帖子

时间:2013-05-19 03:12:38

标签: ruby-on-rails ruby-on-rails-3.2

我对rails& amp;我已经坚持这个问题几个小时了。我正在尝试显示用户喜欢的帖子和用户的实际帖子。

使用我当前的代码,我收到此错误“未定义的方法`标题'为#”,它从这一行中提取:“<%= link_to post.title,post%>”。

Coud有人说明如何才能让它发挥作用? (更多代码如下)

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

这是'show'视图:

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

&lt;%= link_to post.title,post%&gt; display&lt;%= post.inspect%&gt; ”这里是结果

<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">

当我使用它时它起作用 - &gt; @posts = @user.posts.all但问题在我使用时开始 - &gt; @posts = @user.posts.all + @user.likes.all

给了我“未定义的方法`标题'”消息..

4 个答案:

答案 0 :(得分:2)

您可能想要向用户模型添加内容......

class User < ActiveRecord::Base

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

  ...

end

然后,在您的控制器中,您可以执行此操作

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

答案 1 :(得分:1)

我认为在活动记录中它会比使用ruby map

更快
@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查询,当您拥有大量数据时,它会更快。

答案 2 :(得分:0)

好像@user.likes@没有返回Post相关数组或ActiveRelation。

如果假设Like对象具有post_id属性,那么您可能希望修改代码:

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

答案 3 :(得分: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)