【问题标题】:Why does my controller render the wrong view?为什么我的控制器呈现错误的视图?
【发布时间】:2013-07-21 18:59:01
【问题描述】:

我有两个控制器,一个继承自另一个:

class FirstController < ApplicationController
  ...
  def show
   ...
  end
end

class SecondController < FirstController
  ...
  def show
   ...
  end
end

第一个控制器的视图文件夹包含以下文件:

  • views/first/show.html.erb
  • views/first/show.js.erb

第二个控制器的views文件夹只包含HTML文件:

  • views/second/show.html.erb

在控制器的 show 方法中未调用渲染或重定向。

当我将SecondController#show 称为JS 时,我希望views/first/show.js.erb 会被渲染,但这并没有发生。我得到回应:Rendered second/show.html.erb

如果我删除文件views/second/show.html.erb,那么就没有问题,我会回复Rendered first/show.js.erb。为什么会这样?

如何以非显式方式调用父控制器的 JS 视图,例如渲染 first/show

【问题讨论】:

  • 您能显示您的show 方法的代码吗?我怀疑SecondController 中的show 方法没有调用FirstController 中覆盖的show 方法。
  • 我认为这是因为 Rails 中没有以任何方式继承视图,我认为这是正确的行为。

标签: ruby-on-rails ruby ruby-on-rails-3 inheritance


【解决方案1】:

这很奇怪。这只是在黑暗中拍摄,但是如果在您的第​​二个控制器中明确告诉它为 JS 渲染哪个文件会发生什么?

class SecondController < FirstController
  def show
    respond_to do |format|
      format.js { render "first/show.js" }
      format.html
    end
  end
end

【讨论】:

  • 然后一切顺利。但问题是我不能这样做,因为我需要以下行为:如果存在 second/show.js 文件,则呈现,如果没有,则呈现 first/show.js
  • 呃,你可能需要做一些非常老套的东西,比如 File.exists?("#{Rails.root}/app/views/second.js.erb")
猜你喜欢
  • 1970-01-01
  • 2014-12-09
  • 1970-01-01
  • 1970-01-01
  • 2019-03-10
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多