Как вывести значение, являющееся методом в рабле?

Я пытаюсь вывести значение метода в моей модели Item (current_user определен в application_controller). В настоящее время у меня есть шаблон rabl:

object @item
attributes :id, :name

code :is_liked do |this_item|
  if current_user
    this_item.is_liked current_user
  else
    false
  end
end

и в моей модели:

class Item < ActiveRecord::Base
  ...
  def is_liked user
    if user
      if user.liked_item_ids.include?(self.id)
        return true
      else
        return false
      end
    end
  end
  ....
end

но это не работает. Я не уверен, каким будет правильный способ вывода этого. Любая идея, как заставить это работать правильно?

изменить 1

Вот ошибка, которую я получаю:

 Failure/Error: Unable to find matching line from backtrace
 ActionView::Template::Error:
   stack level too deep

person timpone    schedule 19.07.2013    source источник


Ответы (2)


Ваш rabl, похоже, в порядке, однако, когда вы обнаружите, что добавляете некоторую логику в свои представления (rabl можно сравнить с представлением), вы можете подумать о рефакторинге логики в презентаторе.

Подробнее о докладчиках с rabl здесь

Что касается вашей ошибки, как только что сказал @apneadiving, где-то в вашей кодовой базе есть проблема с рекурсией. Просто из любопытства, вы пытались переименовать блок code во что-то другое, чем имя вашего метода? В зависимости от того, какую версию rabl вы используете, это может быть проблемой.

Наконец, вам следует подумать о рефакторинге вашего метода is_liked:

def is_liked user
  return user.liked_item_ids.include?(id) if user
  false
end
person Pierre-Louis Gottfrois    schedule 19.07.2013
comment
спасибо за внимание к докладчикам, я переместил этот фрагмент в сериализаторы активных моделей, и он отлично работает, заставляя меня думать, что это проблема рабла. - person timpone; 19.07.2013
comment
Добро пожаловать, пожалуйста, подумайте о том, чтобы принять ответ, если вы считаете, что он вам помог. - person Pierre-Louis Gottfrois; 20.07.2013

Пытаться:

node(:is_liked) {|this_item| this_item.is_liked(current_user) }

У вас уже есть метод, вы можете просто вызывать его внутри узла вместо того, чтобы воссоздавать логику.

person apneadiving    schedule 19.07.2013
comment
спасибо, я пытался, но обновил вопрос с ошибкой, которую я получаю. Я не уверен, доступен ли current_user в моих шаблонах rabl, и сейчас я это проверяю. - person timpone; 19.07.2013
comment
current_user должен быть доступен. Только что заметил, что вы должны удалить :is_liked из списка attributes + проверить свой метод is_liked - person apneadiving; 19.07.2013
comment
спасибо за комментарий; да, я пробовал и с атрибутами is_liked, и с is_liked, но я согласен с вашим комментарием; обновит вопрос. Я собираюсь переместить current_user во вспомогательный класс, а не в application_controller и как helper_method. спасибо - person timpone; 19.07.2013
comment
у вас проблема с рекурсией, я сомневаюсь, что это связано с кодом, который я вижу - person apneadiving; 19.07.2013
comment
Я согласен - я думаю, что это что-то связанное с current_user; используя его во всех наших представлениях, поэтому странно, что он взрывается только в рабле. Ну, для меня сейчас 1 час ночи - наверное, сейчас не самые лучшие мысли. - person timpone; 19.07.2013