我尝试在我的某个模型中创建一个列,该列使用请求用户的ID来生成列。我从请求标题中获取当前用户:
# app/controllers/posts_controller.rb
if request.headers['Authorization']
token_string = request.headers['Authorization']
current_user = User.where(token: token_string).take
end
我在模型中创建了一个使用current_user
的方法:
# app/models/post.rb
attr_accessor :user_voted
def user_voted(current_user)
if current_user
return PostVote.where(post_id: self[:id], user_id: current_user[:id]).size > 0
else
return false
end
end
在控制器中渲染之前,我做了:
@articles = Article.where(safe_params)
.order(order)
.limit(10)
.offset(offset)
@articles.user_voted current_user
尝试运行时出现以下错误:
NoMethodError (undefined method `user_voted' for #<Post::ActiveRecord_Relation:0x00000003b8fbe8>):
app/controllers/posts_controller.rb:55:in `index'
将控制器信息传递给模型的正确方法是什么?
答案 0 :(得分:0)
@articles
是Post::ActiveRecord_Relation
的实例,而不是Post
的实例。因此,您必须将current_user
合并到控制器中的where
子句中。
@articles = Article.where(safe_params)
.order(order)
.limit(10)
.offset(offset)
@did_user_vote = @articles.joins(:post_votes)
.where(post_votes: { user_id: current_user.id })
.exists?
因此,您在post_votes
查询中加入@articles
关系,并查找该用户PostVotes
的帖子。