我对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
给了我“未定义的方法`标题'”消息..
答案 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)