【问题标题】:ActionViewError:Missing Template inside controller methodActionViewError:控制器方法中缺少模板
【发布时间】:2020-08-18 10:34:01
【问题描述】:

所以,我有 2 个表格。在其中之一中,我将表单提交给方法“create”,这是使用资源创建的默认方法:

resources :correlation_engine_rules 

在这个表单中,我只是通过 simple_form 将表单与路径链接起来:

<%= simple_form_for(:correlation_engine_rule, url: correlation_engine_rules_path, :html => { :remote => true, :method => :post }) do |f| %>

现在,如果我提交,我会在我的控制器中调用名为“create”的方法:

def create
    ...things happening...

    respond_to do |format|
      if @rule.save
        format.html { redirect_to correlation_engine_rules_path(value: @cep_status), notice: "#{I18n.t('controllers.rule_created')}" }
        format.js { flash[:notice] = "#{I18n.t('controllers.rule_created')}" }
        format.json { head :no_content }
      else
        format.html do
          redirect_to correlation_engine_rules_path(@rule),
                      alert: @rule.errors.full_messages.map { |msg| "<li>#{msg}</li>" }.join
        end
        format.js
        format.json { render json: @rule.errors, status: :unprocessable_entity }
      end
    end
  end

规则被保存,页面被重定向到该路径。这是有效的。现在,我想要一个新表单,用另一个方法控制器来处理这些新字段。

所以,我创建了新路线:

resources :correlation_engine_rules do
      get :basic_rule_2, on: :collection
      post :create_basic_rule_2, on: :collection
end

然后我将新表单与我的新方法控制器(create_basic_rule_2)相关联:

<%= simple_form_for(:correlation_engine_rule, url: create_basic_rule_2_correlation_engine_rules_path, :html => { :remote => true, :method => :post }) do |f| %>

当我提交时,控制器被正确调用,问题出现在执行与以前完全相同的重定向时。这里重定向失败,它试图呈现一个名为“create_basic_rule_2”的视图,我不明白。我告诉他像以前一样重定向到 correlation_engine_rules_path。

def create_basic_rule_2
    ...things happening...

    respond_to do |format|
      if @rule.save
        format.html { redirect_to correlation_engine_rules_path(value: @cep_status), notice: "#{I18n.t('controllers.rule_created')}" }
        format.js { flash[:notice] = "#{I18n.t('controllers.rule_created')}" }
        format.json { head :no_content }
      else
        Rails.logger.error "\n\n\n\ NO GUARDADO"
        format.html do
          redirect_to correlation_engine_rules_path(@rule),
                      alert: @rule.errors.full_messages.map { |msg| "<li>#{msg}</li>" }.join
        end
      end
    end
  end

困扰我的是完全相同的代码,无论您身在何处,路径都是相同的,所以为什么 create 不渲染一个名为“create”的视图,但我的方法 create_basic_rule_2 试图渲染一个名为“create_basic_rule_2”的视图?

这是我得到的错误:

<ActionView::MissingTemplate: Missing template correlation_engine_rules/create_basic_rule_2, application/create_basic_rule_2 with {:locale=>[:es, :en], :formats=>[:js, :html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :jbuilder]}. Searched in:
  * "/opt/rb/var/www/rb-rails/lib/modules/vault/app/views"
  * "/opt/rb/var/www/rb-rails/lib/modules/social/app/views"
  * "/opt/rb/var/www/rb-rails/lib/modules/monitor/app/views"
  * "/opt/rb/var/www/rb-rails/lib/modules/location/app/views"
  * "/opt/rb/var/www/rb-rails/lib/modules/ips/app/views"
  * "/opt/rb/var/www/rb-rails/lib/modules/flow/app/views"
  * "/opt/rb/var/www/rb-rails/lib/modules/correlation_engine_rule/app/views"
  * "/opt/rb/var/www/rb-rails/app/views"
  * "/usr/local/rvm/gems/ruby-2.1.2/gems/devise-3.5.10/app/views"
>

【问题讨论】:

  • 无法回答此问题,因为它没有可重现的示例来显示您所询问的行为。如果您不截断错误消息也会有所帮助。
  • 为什么我的控制器方法试图渲染一个名为相同的视图?我怎样才能阻止这种情况发生?这两种方法具有相同的重定向,一种有效,另一种无效。我不能告诉你如何重现这个,因为我也不知道问题是什么或原因是什么。
  • “我怎样才能阻止这种情况发生?” - 渲染、重定向或返回 false 将阻止 rails 隐式渲染。 api.rubyonrails.org/classes/ActionController/…
  • “我不能告诉你如何重现这个,因为我也不知道问题是什么或原因是什么。” - 你希望有人不知道你在做什么,没有看到触发错误的实际代码知道发生了什么?如果您无法完成减少问题的基本步骤,那么除了疯狂猜测之外,任何人都无能为力。
  • 一种方法是尝试渲染具有相同名称的视图,但另一种方法不是,尽管代码相同。也许有人知道为什么会发生这种情况,尽管他无法重现该错误。我知道你在说什么,但这不是我第一次看到人们在没有正确说明问题所在的情况下得到答案,所以我想在这里试试运气,就是这样。无论如何,我编辑了我的问题,以防它现在更清楚,但这几乎就是全部,我的错误中没有更多代码。

标签: ruby-on-rails ruby routes simple-form


【解决方案1】:

如果您设置 MRE 并检查请求的请求类型(在日志的第一行提示),您会发现问题实际上非常简单:

<%= simple_form_for(:correlation_engine_rule, url: create_basic_rule_2_correlation_engine_rules_path, :html => { :remote => true, :method => :post }) do |f| %>

当您设置 data-remote="true" option 时,Rails UJS 默认发送那些讨厌的 application/javascript AJAX 请求。

这意味着控制器实际上正在执行这个块:

format.js { flash[:notice] = "#{I18n.t('controllers.rule_created')}" }

由于它不渲染或重定向 rails 将隐式尝试查找名为 create_basic_rule_2 的模板。在format.js 响应中重定向实际上不会做任何事情,因为它是一个 AJAX 请求。

你想设置remote: false:

<%= simple_form_for(:correlation_engine_rule, url: create_basic_rule_2_correlation_engine_rules_path, html: { remote: false, method: :post }) do |f| %>

这只会正常提交表单并触发format.html 块。

如果你真的想发送一个 ajax 请求并导致重定向,你必须创建一个模板并设置 window.location:

# views/controller_name/correlation_engine_rule.js.erb
window.location = '/new_location'

【讨论】:

  • 是的,问题出在远程:true,更改为远程 false 解决了问题。我仍然有点惊讶这个错误不会以其他形式发生,我也有远程:真的,无论如何非常感谢。
猜你喜欢
  • 1970-01-01
  • 2014-12-19
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
  • 2020-04-09
  • 1970-01-01
相关资源
最近更新 更多