4

对于一个插件,我想将以下功能破解到 Rails 中:

当(部分)模板不存在时(无论格式如何),我想呈现默认模板。

因此,假设如果 users/index.html.erb 不存在(或其他格式),我将操作称为“users/index”,则应该呈现“default/index.html.erb”。

同样,如果我调用操作“locations/edit”并且“locations/edit.html.erb”不存在,则应该呈现“default/edit.html.erb”

对于部分,如果我调用一个动作'locations/index'并且模板'locations/index.html.erb'调用不存在的部分'locations/_location',它应该呈现'default/_object'

解决方案是 seek 让我可以访问模板变量(例如@users、@locations)和有关请求路径的信息(例如用户/索引、位置/编辑)。它也应该适用于部分。

我已经想到了一些我将在下面发布的选项。没有一个是完全令人满意的。

4

4 回答 4

12

解决方案2:

在 ApplicationController 中使用“rescue_from”


class ApplicationController > ActionController::Base
  rescue_from ActionView::MissingTemplate do |exception|
    # use exception.path to extract the path information
    # This does not work for partials
  end
end



缺点:不适用于局部。

于 2009-05-12T09:12:10.690 回答
3

在查看 controller/template.html.erb 之后,Rails 3.1 会自动在 application/template.html.erb 中查找文件,您可以在 Exception 中看到如下所示:

Missing template [controller name]/index, application/index with {:locale=>[:en, :en], :formats=>[:html], :handlers=>[:erb, :coffee, :builder]}. Searched in: * "/path/to/rails_project/app/views" 

所以,只需将您的默认模板放在 app/views/application

于 2011-09-05T18:18:13.980 回答
2

我找到了一个相对干净的补丁,它只修补了模板的查找,这正是问题中所需要的。


module ActionView
  class PathSet

    def find_template_with_exception_handling(original_template_path, format = nil, html_fallback = true)
      begin
        find_template_without_exception_handling(original_template_path, format, html_fallback)
      rescue ActionView::MissingTemplate => e
        # Do something with original_template_path, format, html_fallback
        raise e
      end
    end
    alias_method_chain :find_template, :exception_handling

  end
end
于 2009-05-12T15:53:41.987 回答
0

解决方案1:

猴子补丁 ActionView::Base#render


module ActionView
  class Base
    def render_with_template_missing(*args, &block)
      # do something if template does not exist

      render_without_template_missing(*args, &block)
    end
    alias_method_chain :render, :template_missing
  end
end

这个猴子补丁需要查看 Rails 的(变化的)内部结构并导致代码丑陋,但可能有效。

于 2009-05-12T09:08:16.157 回答