#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
.