Rails RABL отображает коллекцию как объект и дочерний элемент в этом объекте

У меня есть такой index.rabl:

collection @exchangers, :root => "bank", :object_root => false

extends "exchanger_lists/show"

и такой шоу.рабль:

object @exchanger
attributes :id, :name, :address, :location_id, :latitude, :longitude, :exchanger_type_id
node(:location_name) {|exchanger_list| exchanger_list.location.name }
node(:exchanger_type_name) {"normal" }
child @currencies do
      attribute :value, :direction_of_exchange_id, :exchanger_list_id
end

мой контроллер такой:

def index
    @exchangers = ExchangerList.all
  end
 def show
    @exchanger = ExchangerList.find(params[:id])
    @currency_list = CurrencyList.all
    @currencies = []
    @currency_list.each do |c|
      @currencies << CurrencyValue.find(:all, :conditions => {:currency_list_id => c.id, :exchanger_list_id => @exchanger.id}, :order => :updated_at).last(2)
    end
    @currencies.flatten!
  end

если я вызываю в браузере метод show, я вижу дочерние @currencies и их данные, но если я вызываю index, я вижу все (также я вижу узлы), но дочерний я не видел.... Что не так? что я делаю плохо?


person Valdis Azamaris    schedule 24.04.2013    source источник
comment
Вы имеете в виду, что не видите дочерних узлов @currencies? Эта переменная экземпляра будет равна нулю, когда вы вызываете index и отображаете только шаблон шоу.   -  person dan    schedule 24.04.2013
comment
@dan да, может быть, ты и прав.... но как тогда я могу решить свою проблему?   -  person Valdis Azamaris    schedule 24.04.2013
comment
Я не игнорирую вас, я отправил ответ из-за нехватки места в комментарии.   -  person dan    schedule 24.04.2013


Ответы (1)


Ваша архитектура немного запутана, потому что в действии show вы не только отображаете @exchanger, но и полный список @currencies равен нулю при отображении show в шаблоне индекса. В общем, я бы посоветовал вам подумать о всей архитектуре приложения.

Когда я должен был дать вам простое решение для вашей текущей проблемы, я бы извлек код @currencies из действия show в вспомогательный метод в app/helpers/currencies_helper.rb и получил к нему доступ из шаблона show.

module CurrenciesHelper

  def currencies(exchanger)
    currencies = CurrencyList.all.map do |c|
      CurrencyValue.find(:all, :conditions => {:currency_list_id => c.id, :exchanger_list_id => exchanger.id}, :order => :updated_at).last(2)
    end
    currencies.flatten!
  end

end

Кстати, я заменил метод each на map, потому что в данном случае он лучше подходит.

Измените часть валюты в шаблоне шоу на

child currencies(@exchanger) do
  attribute :value, :direction_of_exchange_id, :exchanger_list_id
end
person dan    schedule 24.04.2013
comment
ок, попробуем, добавьте пожалуйста информацию о том, что писать тогда в виду и методе - person Valdis Azamaris; 24.04.2013
comment
в действии шоу все в порядке, но в представлении я получаю Called id для nil, который по ошибке будет равен 4, возможно, потому что не все данные в БД связаны, не все обменники имеют валютные_значения .... реально ли это поймать и решить? - person Valdis Azamaris; 24.04.2013
comment
Эй, извините, я забыл атрибут обменника во вспомогательном методе, я обновил свой ответ. - person dan; 24.04.2013
comment
хм( действительно странно, но теперь не работает.... только если я удалю :exchanger_list_id => exchanger.id тогда все в порядке - person Valdis Azamaris; 24.04.2013
comment
хорошо, но это, похоже, проблема с доступными данными, и, как я уже говорил, ваша архитектура, как правило, немного запутана, например. Я не знаю, почему для вас exchanger_list_id совпадает с exchanger.id, я только ответил на вашу проблему, почему при вызове действия index не отображаются валюты. - person dan; 24.04.2013
comment
ок.... также exchanger_list_id есть в модели currency_values, но exchanger.id в exchanger_list с моделью все ок, по другому и быть не может - person Valdis Azamaris; 24.04.2013
comment
все, что я должен был написать, было: валюты (root_object)) - person Valdis Azamaris; 24.04.2013