Rails: использование абсолютного пути в Rails 6

Недавно я обновил приложение Rails, которое я поддерживаю, до версии Rails 6 RC2 (начиная с версии 5.2.3). Итак, сразу после обновления я запустил автоматические тесты (RSpec), и результаты теста выдали мне множество предупреждений об устаревании. Одним из таких предупреждений было:

DEPRECATION WARNING: render file: should be given the absolute path to a file

Итак, я перешел к файлу представления, вызвавшему предупреждение, и внес следующие изменения:

До: render file: 'devise/sessions/new'

После: render file: Rails.root.join('app', 'views', 'devise', 'sessions', 'new.html.slim')

Я снова провел тесты, никаких предупреждений об устаревании не было. Однако после переключения на абсолютные пути представление теперь отображает только простой HTML-код, но если я удалю расширение .slim, т.е.

render file: Rails.root.join('app', 'views', 'devise', 'sessions', 'new.html')

Соответствующее представление отображается правильно, но теперь тест будет жаловаться на то, что не используются абсолютные пути. Есть ли способ исправить это или это ошибка Rails/Slim?


person DJenuil    schedule 03.08.2019    source источник


Ответы (2)


В вашем случае похоже, что вы хотите отобразить обычное представление, то есть шаблон.

В этом случае использование опции file не рекомендуется. Вместо этого вы должны использовать опцию template.

render template: 'devise/sessions/new'

Или, что еще лучше, вы можете использовать этот ярлык:

render 'devise/sessions/new'

Фон

Параметр file предназначен для отображения представления, которое находится вне вашего приложения Rails, где вы не можете полагаться на логику поиска представлений Rails. Следовательно, Rails хочет иметь абсолютный путь. Требование абсолютного пути также заставляет разработчика думать об относительных сегментах пути (/../).

Отсутствие расширения .slim и последующая обработка файла механизмом шаблонов — это функция, предназначенная для шаблонов. Использование file, кажется, обеспечивает ту же самую функциональность, но я предполагаю, что это просто побочный эффект внутренней работы поиска пути просмотра. Похоже, что разработчики Rails хотят улучшить различие между файлами и шаблонами в будущем, и отказ от относительных файлов является промежуточным шагом, чтобы не сломать слишком много существующих приложений, которые полагаются на использование file и все еще ожидают функций шаблона.

PS: нет необходимости вручную разбивать ваш путь. Поэтому, если вы по какой-то причине все еще хотите использовать file с абсолютным путем, вместо

render file: Rails.root.join('app', 'views', 'devise', 'sessions', 'new.html.slim')

использовать это

render file: Rails.root.join('app/views/devise/sessions/new.html.slim')
person Daniel Rikowski    schedule 03.08.2019
comment
Я переворачиваю вид в виде файла в виде расширенного макета. Добавление абсолютного пути не удаляет предупреждения об устаревании. - person Naga Lokesh Kannumoori; 16.11.2020

У меня была такая же проблема при работе над приложением Rails 6 только для API.

Я хотел отобразить статическую страницу из контроллера с именем home_controller.rb

Вот мой код:

require 'rails/application_controller'

class HomeController < Rails::ApplicationController
  def index
    render file: Rails.root.join('public/index.html')
  end
end

Но когда я пытаюсь получить доступ к странице, я получаю сообщение об ошибке:

Started GET "/favicon.ico" for ::1 at 2021-02-23 16:25:41 +0100
Processing by HomeController#index as */*
  Parameters: {"other"=>"favicon"}
Completed 500 Internal Server Error in 1ms (ActiveRecord: 0.0ms | Allocations: 301)
 
ArgumentError (`render file:` should be given the absolute path to a file. '/home/my-computer/Projects/MyWebsite/public/index.html' was given instead):

Вот как я решил эту проблему:

Проблема заключалась в том, что мне не хватало файла index.html в каталоге public, поэтому Rails не мог его найти.

Все, что мне нужно было сделать, это добавить файл index.html в каталог public. На этот раз, когда я тестировал, все было в порядке.

Это все.

Надеюсь, это поможет

person Promise Preston    schedule 23.02.2021