2

我对 Rails 还很陌生,我已经被这个问题困住了几个小时。我正在尝试显示用户喜欢的帖子和用户的实际帖子。

使用我当前的代码,我收到此错误“未定义的方法 `title' for #”,它是从这一行中提取的:“<%= 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, post %> 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

这给了我“未定义的方法‘标题’”消息..

4

4 回答 4

2

您可能想向用户模型添加一些东西......

class User < ActiveRecord::Base

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

  ...

end

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

@posts = @user.posts + @user.liked_posts 
于 2013-05-19T04:10:00.380 回答
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 查询,当您拥有大量数据时它会更快。

于 2013-05-19T04:07:37.047 回答
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)
于 2013-05-19T04:46:36.693 回答
0

似乎@user.likes@没有返回Post相关的 Array 或 ActiveRelation。

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

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

于 2013-05-19T04:01:18.020 回答