Оберните один объект в массив для FullCalendar в Rails

У меня есть экземпляр модели Rails, который мне нужно использовать jBuilder для преобразования в json. Мой код в настоящее время:

json.name @trip.name
json.title @trip.name
json.start_date @trip.start_date
json.end_date @trip.end_date
json.start @trip.start_date
json.end @trip.end_date
json.allDay true
if ActiveRecord::Type::Boolean.new.cast(params[:show_visits]) == true
    json.visits @trip.visits.each do |visit|
        json.date visit.date.to_date.day.ordinalize + " " + visit.date.to_date.strftime("%b %Y")
        json.park visit.park.name
        json.first_on_trip visit.first_on_trip?
        json.last_on_trip visit.last_on_trip?
        # json.gallery visit.has_gallery? ? url_for(visit.album) : false
        if visit.park.has_location?
            json.park_lat visit.park.lat
            json.park_lng visit.park.lng
        end
    end
end

По сути, мне нужно обернуть это в массив, поскольку это то, что ожидает FullCalendar. У меня этот файл json вызывается в другом месте, поэтому часть массива также должна быть необязательной.

Как я могу использовать jBuilder для добавления массива обертки к моему выводу?


person rctneil    schedule 06.03.2021    source источник


Ответы (1)


Вероятно, вам следует разделить код на три файла. Сначала создайте частичный код из приведенного выше кода, вы можете назвать его, например, _trip.json.jbuilder:

json.name trip.name
json.title trip.name
json.start_date trip.start_date
json.end_date trip.end_date
json.start trip.start_date
json.end trip.end_date
json.allDay true
if ActiveRecord::Type::Boolean.new.cast(params[:show_visits]) == true
    json.visits trip.visits.each do |visit|
        json.date visit.date.to_date.day.ordinalize + " " + visit.date.to_date.strftime("%b %Y")
        json.park visit.park.name
        json.first_on_trip visit.first_on_trip?
        json.last_on_trip visit.last_on_trip?
        # json.gallery visit.has_gallery? ? url_for(visit.album) : false
        if visit.park.has_location?
            json.park_lat visit.park.lat
            json.park_lng visit.park.lng
        end
    end
end

Я также удалил переменную экземпляра и заменил ее локальной. Теперь вы можете создать два представления, в которых вы будете использовать этот фрагмент: одно для календаря, а второе для другого места:

calendar.json.jbuilder

json.array! [@trip] do |trip|
  json.partial! "path/to/trip", locals: { trip: trip }
end

other_place.json.jbuilder будет еще проще:

json.partial! "path/to/trip", locals: { trip: @trip }

Точный код частичного рендеринга см. в документации по jBuilder. Это может быть немного сложнее или даже проще в зависимости от расположения этих файлов в представлениях.

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

person edariedl    schedule 06.03.2021
comment
Ах фантастика! Синтаксис этой строки: json.array! [@trip] do |trip| — это бит, на котором я споткнулся. Следующим на повестке дня стоит привести в порядок и провести рефакторинг всего превращения в частичные вещи! Большое большое спасибо! - person rctneil; 06.03.2021
comment
Могу я просто спросить, где был задокументирован синтаксис [] для достижения этого, или вы просто знали его откуда-то? Я искал, как добиться этого целую вечность! У меня была именно такая строка, но без квадратных скобок! - person rctneil; 06.03.2021
comment
Это явно не задокументировано, я знал, что json.array! нужна коллекция, и, просматривая исходный код, я увидел, что по умолчанию для этого метода используется пустой массив. Я просто соединил точки. Кстати. вы бы достигли того же, если бы @trip была не просто одной записью, а коллекцией с одной записью, например, что-то вроде этого @trip = Trip.where(id: 123). Тогда вам не понадобится явный вызов [] в json.partial!. - person edariedl; 06.03.2021
comment
Спасибо за объяснение! - person rctneil; 07.03.2021