Rails 5.1
In my controllers/fw_exports_conttroller.rb, I have:
def import_spreadsheet
@import_spreadsheet = FwExport.new
render template: "fw_exports/_import_spreadsheet"
end
当我为此控制器操作选择菜单项时,我收到以下错误消息:
Processing by FwExportsController#import_spreadsheet as HTML
ActionView::MissingTemplate (Missing template fw_exports/_import_spreadsheet with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :slim, :coffee, :jbuilder]}. Searched in:
* "/home/utils/rails/follower_wonk/app/views"
* "/home/utils/.rvm/gems/ruby-2.4.2/gems/devise_invitable-1.7.2/app/views"
* "/home/utils/.rvm/gems/ruby-2.4.2/gems/devise-4.3.0/app/views"
):
FATAL -- : [d37603eb-3da3-4ad2-b81b-29198e6bb773] app/controllers/fw_exports_controller.rb:67:in `import_spreadsheet'
我证实了这一点
app/views/fw_exports/_import_spreadsheet.html.slim
确实存在。有任何想法吗?
通过“_”fw_exports/_import_spreadsheet.html.slim
看起来像是部分的,当渲染部分时,你可以跳过partial
选项,只需在views
文件夹之后传递文件的路径,在你的情况下:
def import_spreadsheet
@import_spreadsheet = FwExport.new
render 'fw_exports/import_spreadsheet'
end
注意render 'fw_exports/import_spreadsheet'
即使文件没有“_”前缀也会起作用,这与template
选项不同,它不接受部分文件。
从Layout documentation和this post看起来你不应该把你的部分的下划线。
该文件指出:
Rails知道该视图属于不同的控制器,因为字符串中嵌入了斜杠字符。如果要显式,可以使用:template选项(在Rails 2.2和更早版本中是必需的)
这意味着您不需要提供控制器的路径,因为您在这里处理相同的路径:
据@SebastiánPalma建议编辑
def import_spreadsheet
@import_spreadsheet = FwExport.new
render "fw_exports/import_spreadsheet"
end
应该只是解决你的问题。在Rails V2.2之前还需要template
,但由于您使用的是5.1,因此不需要使用它。你可以简单地做render 'import_spreadsheet'
或者,可能:
class FwExportsController < ApplicationController
def import_spreadsheet
@import_spreadsheet = FwExport.new
end
end
如果你有app/views/fw_exports/import_spreadsheet.html.slim
(视图,而不是部分),那么我认为它将默认/约定呈现。
如果你刚刚更新到Rails 5.1并且看到了这个错误,它也可能是由于在控制器中使用render nothing
引起的,因为在Rails 5.1中删除了这个方法。这并不总是很明显,因为有时控制器线可能在堆栈跟踪的几个深度。但是如果你检查堆栈跟踪中所有控制器的行号并找到render nothing
,你就找到了罪魁祸首。如果这确实是您的问题,那么您需要做的就是替换这个旧方法。
例如,如果您的旧代码是:render nothing: true, status: 403
您可以通过将其更改为:head :forbidden
来修复错误
我假设你需要渲染Template
而不是Partial
。
要渲染Template
,您需要将_import_spreadsheet.html.slim
重命名为import_spreadsheet.html.slim
。
您在代码中需要进行以下修改
步骤1
def import_spreadsheet
@import_spreadsheet = FwExport.new
render template: "fw_exports/import_spreadsheet"
end
在这里你需要从_
中删除_import_spreadsheet
第2步
将文件重命名为app/views/fw_exports/import_spreadsheet.html.slim
而不是app/views/fw_exports/_import_spreadsheet.html.slim