2010-04-30 6 views
20

Я использую метод to_json для объекта и пытаюсь заставить аргумент :methods работать. У меня есть метод на моей модели (Drop) под названием is_favorited_by_user?. Этот метод принимает аргумент current_user, а затем проверяет, нравится ли капля пользователем. Как передать этот аргумент с помощью метода to_json.Ruby to_json: methods arguments

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

ответ

36

Вы можете добавить current_user атрибут вашей модели и установить его перед выполнением 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

Это сработало! Спасибо, Войта! –

+4

Как расширить это решение, когда я делаю рендеринг: json => Drop.all в действии индекса. Где я могу назначить current_user? –

+3

'cattr_accessor: current_user' в модели, а затем' Model.current_user = current_user' в контроллере. –

4

Метода to_json принимает не предназначена, чтобы быть те, которые принимают аргументы, но только «геттерная» метода. (Как правило, те, созданные на основе ваших атрибутов БД.)

Смотрите примеры здесь, ни один передают аргументы:

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

Если вы хотите сделать что-то обычай, вам нужно создать метод, который создает хэш информации, которую вы хотите, а затем конвертируете этот хэш в json.

+1

Есть ли способ, что я могу получить переменную current_user в моей модели, так что мне не нужно передать аргумент? –

+0

Модели @JamesFinley не (и не должны) знать состояние контроллеров или HTTP-запрос. current_user является частью запроса и не должен подвергаться воздействию моделей в глобальном масштабе из-за многопоточной проблемы, указанной выше. Он должен передаваться только как параметр метода. – hammady

Смежные вопросы