Rails:Rails 6 中绝对路径的使用

问题描述 投票:0回答:2

最近,我将正在维护的 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 的错误?

ruby-on-rails ruby-on-rails-6
2个回答
37
投票

在您的情况下,您似乎想要渲染普通视图,即模板

在这种情况下,不推荐使用

file
选项。相反,您应该使用
template
选项。

render template: 'devise/sessions/new'

或者更好的是,您可以使用此快捷方式:

render 'devise/sessions/new'

(仅在控制器中。在视图/模板中,单个字符串参数是

partial:
选项的快捷方式。)

背景

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')



9
投票
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
中。这次我测试的时候没问题。
仅此而已。

我希望这有帮助

© www.soinside.com 2019 - 2024. All rights reserved.