在 Rails 中将单个对象包装在 FullCalendar 数组中

Wrap single object in array for FullCalendar in 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 将包装数组添加到我的输出?

您或许应该将代码分成三个文件。首先从上面的代码创建一个部分,您可以将其命名为 _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 documentation。根据这些文件在视图中的位置,它可能会更复杂甚至更容易。

您可能可以直接在部分中使用实例变量,但此解决方案使其更通用一些,因此部分可以在更多不同的上下文中使用。