отображать шаблон по умолчанию, когда запрашиваемый шаблон отсутствует в Rails - PullRequest
4 голосов
/ 12 мая 2009

Для плагина я хочу взломать следующую функцию в Rails:

Если (частичный) шаблон не существует (независимо от формата), я хочу создать шаблон по умолчанию.

Так, скажем, я называю действие 'users / index', если users / index.html.erb не существует (или другой формат), должен отображаться 'default / index.html.erb'.

Точно так же, если я вызываю действие 'location / edit' и 'location / edit.html.erb' не существует, 'default / edit.html.erb' должно быть отображено

Для частичных версий, если я вызываю действие 'location / index', а шаблон 'местоположения / index.html.erb' вызывает частичный 'location / _location', который не существует, он должен отобразить 'default / _object'

Решение - поиск, дает мне доступ к переменным шаблонов (например, @users, @locations) и информации о запрошенном пути (например, пользователи / индекс, местоположения / редактировать). И это должно также работать с частями.

Я подумал о некоторых опциях, которые я опубликую ниже. Ни один из них не является полностью удовлетворительным.

Ответы [ 4 ]

11 голосов
/ 12 мая 2009

Решение 2:

Используйте 'rescue_from' в ApplicationController



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



Недостаток: не работает с частями.

3 голосов
/ 05 сентября 2011

Rails 3.1 автоматически ищет файлы в application / template.html.erb, после просмотра в controller / template.html.erb, вы можете увидеть это в Исключении так:

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

2 голосов
/ 12 мая 2009

Я нашел патч, который является относительно чистым, он исправляет только поиск шаблона, который именно то, что требовалось в вопросе.


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
0 голосов
/ 12 мая 2009

Решение 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

Этот патч обезьяны требует изучения (изменения) внутренних частей рельсов и приводит к ужасному коду, но, вероятно, работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...