Игнорируются файлы Rails 4 * .json.jbuilder

#ruby-on-rails #json #ruby-on-rails-4 #jbuilder

#ruby-on-rails #json #ruby-on-rails-4 #jbuilder

Вопрос:

В моем приложении Rails 4.1.1 (в которое включен драгоценный камень jbuilder) представления json всегда выводят все столбцы в таблице, игнорируя app/views/[model]/*.json.jbuilder файлы.

В routes.rb у меня есть:

   resources :workshops do
    resources :memberships
    resources :events
  end
  

В events_controller.rb у меня есть:

   # GET /workshop/:workshop_id/events
  # GET /workshop/:workshop_id/events.json
  def index
    @events = @workshop.events    
    respond_to do |format|
      format.html 
      format.json { render json: @events }
    end
  end
  

Я установил переменную @workshop в «before_action» в контроллере.

Когда я посещаю /workshops/f00/events , он отображается в формате HTML, как и ожидалось.

Если я создам файл, app/views/events/index.json.jbuilder :

 json.events do
end
  

… когда я посещаю /workshops/f00/events.json , я ожидаю, что вывод будет пустым. Тем не менее, я получаю содержимое всего @events в формате JSON.

Я хотел бы видеть, что выводятся только определенные поля, учитывая app/views/events/index.json.jbuilder , что a содержит:

 json.array!(@events) do |event|
  json.extract! event, :id, :title, :description
  json.start event.starts_at
  json.end event.ends_at
  json.url workshop_event_url([@workshop, event], format: :json)
end
  

… но независимо от содержимого файла .jbuilder, результат всегда один и тот же. Кто-нибудь может сказать мне, почему мой файл .jbuilder игнорируется и как заставить его работать?

Ответ №1:

Строка format.json { render json: @events } всегда будет отображать @events массив, поскольку URL /workshops/f00/events -адрес принимает оба html json формата и, и вы выполняете рендеринг @events при нажатии на url с json форматом.

Если вы хотите отобразить данные в app/views/events/index.json.jbuilder изменении:

 respond_to do |format|
  format.html 
  format.json { render json: @events }
end
  

Для:

 respond_to do |format|
  format.html 
  format.json
end
  

Не отображая @events массив, вы полагаетесь на Rails для вывода всего, что есть app/views/events/index.json.jbuilder .