Rails 5 API将控制器变量传递给模型

时间:2016-01-16 20:50:23

标签: ruby-on-rails rails-api ruby-on-rails-5

我尝试在我的某个模型中创建一个列,该列使用请求用户的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'

将控制器信息传递给模型的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

@articlesPost::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的帖子。