Rails找不到模板

时间:2017-10-30 18:31:21

标签: ruby-on-rails actionview

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

确实存在。有任何想法吗?

5 个答案:

答案 0 :(得分:3)

通过" _" 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选项不同,前缀不接受部分文件。

答案 1 :(得分:2)

Layout documentationthis 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'

答案 2 :(得分:1)

或者,可能:

class FwExportsController < ApplicationController

  def import_spreadsheet
    @import_spreadsheet = FwExport.new 
  end

end

如果你有app/views/fw_exports/import_spreadsheet.html.slim(一个视图,而不是一个部分),那么我认为它将默认/约定呈现。

答案 3 :(得分:0)

如果你刚刚更新到Rails 5.1并且看到了这个错误,那么它也可能是由于在控制器中使用render nothing引起的,因为在Rails 5.1中删除了这个方法。这并不总是很明显,因为有时控制器线可能在堆栈跟踪的几个深度。但是如果你检查堆栈跟踪中所有控制器的行号并找到render nothing,你就找到了罪魁祸首。如果这确实是你的问题,你需要做的就是替换这个旧方法。

例如,如果您的旧代码是: render nothing: true, status: 403

您可以通过将错误更改为:head :forbidden

来修复错误

答案 4 :(得分:-2)

我假设您需要呈现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