如何使用葡萄实体将参数传递给模型方法?
我想在显示项目时检查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可能应该从最后一段代码中发送出去,但我无法想象如何去做:(
有什么想法? 谢谢!
答案 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
左右。不写入数据库。