Рельсы 6.1.4 Предупреждение об устаревании: Отображение действий с помощью».»

#ruby-on-rails #ruby-on-rails-6.1

Вопрос:

Я получаю предупреждение об устаревании при запуске rails test . Это предупреждение находится ниже. Я ценю любую помощь в определении того, что я делаю неправильно.

(Правка: Примечание сбоку, рендеринг ДОЛЖЕН прерваться и вернуться после текущего вызова контроллера. Я попытался использовать ApplicationController.render(...) вместо текущего render вызова, но он не вернулся после вызова контроллера, и я получал ошибки/предупреждения :no_content rendered .)

Предупреждение:

 DEPRECATION WARNING: Rendering actions with '.' in the name is deprecated: actions/action_success.json (called from update at /<path>/app/controllers/table_base_controller.rb:39)
 

Код, выдающий предупреждение, — это именно этот вызов render внутри контроллера:

 render('/actions/action_success.json', locals: {
  view: action.lookup_view('default'),
  action: action,
  area: current_area,
  account: current_account
}) 
 

Я попытался снять .json , как указано (также попытался добавить template: <path> , попытался file: <path> ), однако я получаю эту ошибку в консоли тестирования:

 Error:
TableControllerTest#test_Admin_should_update_via_loan_table:
ActionView::MissingTemplate: Missing template actions/action_success with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :jbuilder]}. Searched in:
  * "/<path>/app/views"

    app/controllers/table_base_controller.rb:39:in `update'
    app/controllers/application_controller.rb:79:in `with_account'
    test/controllers/table_controller_test.rb:14:in `block in <class:TableControllerTest>'
 

Файл, о котором идет речь (путь: app/views/actions/action_success.json.jbuilder ):

 # frozen_string_literal: true

json.status 'success'
json.status_code 200
json.messages action.messages

if view
  json.result do
    json.partial! view.to_s, result: action.result, locals: { area: area }
  end
else
  json.result action.result
end
 

Комментарии:

1. Ваш запрос, попадающий в действие, не запрашивает ответ json, поэтому он пытается отобразить HTML

Ответ №1:

Устаревание частичных имен, включающих a . , было сделано для предотвращения двусмысленности при анализе частичного имени. Мы должны явно указывать форматы, а не включать их в частичное имя, которое мы передаем для визуализации.

Без формата в строке, которую вы передаете, вам необходимо убедиться formats , что ожидаемый рендеринг включает формат, который вы используете, в данном случае json , который не является одним из форматов по умолчанию.

Вы можете отправить его в качестве опции (и также сделать частичное имя опцией), как это:

 render(
  partial: '/actions/action_success',
  formats: [:json],
  locals: {
    view: action.lookup_view('default'),
    action: action,
    area: current_area,
    account: current_account
  }
)