2014-04-19 2 views
3

포도 요소를 사용하여 모델 메서드에 인수를 전달하려면 어떻게해야합니까?grape-entity를 사용하여 모델 메서드에 인수를 전달합니다.

나는 항목을 제시 할 때 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 

을하지만 난 grape-에 CURRENT_USER를 전송하는 방법을 모른다 엔티티 모델 : 포도 API의

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 

:

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

I current_user가이 마지막 코드 조각에서 전송되어야한다고 생각하지만, 어떻게해야 하는지를 알 수는 없습니다 : (

어떤 생각이 들었습니까? 감사합니다.

답변

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 
+0

그것은 당신이 그것을 할 수 있습니다, 그것은하지만 가장 좋은 방법 의미하지 않는다. 내가 제안한 방식대로 클리너. – oliverbarnes

+0

@ 올리버 반즈 (Oleiver Barnes) 나는 포도 주스를 처음 보았습니다. 어떻게 제안이 더 깨끗해 졌는지 자세히 설명 할 수 있습니까? 나에게 당신의 제안으로, 데이터베이스에있는 실제 레코드를 엔티티로 전달하는 것으로 변경하는 것 같습니다. 이것은 나에게 깨끗해 보이지 않습니다. – mfunaro

+2

나는 실제로 어떤 경우에도'update_attributes'를 사용하지 않기를 권합니다. 그것은 실제로 데이터베이스 변경을 수행하고 절대 원하지 않습니다. 두 사용자가 동시에 라우트를 요청하면 적어도 하나의 사용자에 대해'current_user' 값을 혼합 할 가능성이 큽니다. – aherve

0

@aherve은, 어떤 이유로 당신의 구문은 내 경우에는 작동하지 않습니다. Grape Entity docs의 구문은 조금 다른

당신의 예입니다, 구문은 다음과 같아야합니다

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