用葡萄实体将参数传递给模型方法

时间:2014-04-19 17:49:35

标签: ruby-on-rails devise grape grape-api

如何使用葡萄实体将参数传递给模型方法?

我想在显示项目时检查current_user是否喜欢某个项目,因此我构建了一个模型user_likes?方法:

class Item
  include Mongoid::Document
  #some attributes here...
  has_and_belongs_to_many :likers

  def user_likes?(user)
    likers.include?(user)
  end
end

但我不知道如何将current_user发送到葡萄实体模型:

module FancyApp
  module Entities
    class Item < Grape::Entity
      expose :name #easy
      expose :user_likes # <= How can I send an argument to this guy ?
    end 
  end
end

在葡萄api中:

get :id do
  item = Item.find(.....)
  present item, with: FancyApp::Entities::Item # I should probably send current_user here, but how ?
end

我觉得current_user可能应该从最后一段代码中发送出去,但我无法想象如何去做:(

有什么想法? 谢谢!

3 个答案:

答案 0 :(得分:6)

好吧,我发现我可以将current作为参数传递,并在块中使用它。所以:

present item, with: FancyApp::Entities::Item, :current_user => current_user 

并在实体定义中:

expose :user_likes do |item,options|
  item.user_likes?(options[:current_user])
end

答案 1 :(得分:0)

@aherve,出于某种原因你的语法在我的情况下不起作用。 Grape Entity docs中的语法略有不同

你的例子,语法应该是:

expose(:user_likes) { |item, options| item.user_likes?(options[:current_user]) }

答案 2 :(得分:0)

另一种方法是通过定义属性访问器将当前用户临时存储在项目中:

TaskCompletionSource

并在grape api中设置当前用户:

class Item
  include Mongoid::Document
  #some attributes here...
  has_and_belongs_to_many :likers
  attr_accessor :current_user

  def user_likes
    likers.include?(current_user)
  end
end

无需更改葡萄实体模型。
没有数据库字段get :id do item = Item.find(.....) item.current_user = current_user present item, with: FancyApp::Entities::Item end 左右。不写入数据库。