2010-04-30 22 views
20

Używam metody to_json na obiekcie i próbuję uzyskać argument o wartości :methods. Mam metodę na moim modelu (Drop) o nazwie is_favorited_by_user?. Ta metoda pobiera argument current_user, a następnie sprawdza, czy upuszczenie jest preferowane przez użytkownika. Jak mogę przekazać ten argument za pomocą metody to_json.Ruby to_json: argumenty metod

render :json => @drops.to_json(:methods => :is_favorited_by_user?(current_user)) 

Odpowiedz

36

Możesz dodać atrybut current_user do modelu i ustawić go przed wykonaniem to_json

attr_accessor :current_user 

    def is_favorited_by_user?(user=nil) 
    user ||= current_user 
    # rest of your code 
    end 


@drops.current_user = current_user 
render :json => @drops.to_json(:methods => :is_favorited_by_user?) 
+0

To działało! Dzięki, Voyta! –

+4

Jak rozszerzyć to rozwiązanie, gdy robię render: json => Drop.all w akcji indeksu. Gdzie przypisać current_user? –

+3

'cattr_accessor: current_user' w modelu, a następnie' Model.current_user = current_user' w kontrolerze. –

4

Metody to_json zajmuje nie mają być te, które mają argumenty, ale po prostu „getter” metody. (Zwykle te, stworzone w oparciu o atrybuty db.)

Zobacz przykłady tutaj żaden argumenty karnetów:

http://apidock.com/rails/ActiveRecord/Serialization/to_json

Jeśli chcesz zrobić coś niestandardowego, musisz stworzyć metodę, która buduje skrót informacji, które chcesz, a następnie przekształca ten skrót w json.

+1

Czy istnieje sposób, że można uzyskać zmienną current_user w moim modelu, więc nie trzeba przekazać argument? –

+0

@JamesFinley Modele nie są (i nie powinny) być świadome stanu kontrolerów lub żądania http. current_user jest częścią żądania i nie powinno być narażone na modele w sposób globalny z powodu opisanego powyżej problemu wielowątkowego. Powinien być przekazywany tylko jako parametr metody. – hammady