Задание форматов представления для пользовательских типов MIME в Ruby on Rails - PullRequest
1 голос
/ 19 января 2012

Я создаю собственный тип MIME в rails для использования с response_to

Mime::Type.register_alias "text/html", :modal

Я хочу использовать этот тип MIME в response_to следующим образом:

respond_to do |format|                                                                                                                                     
  format.html{ render 'index'}                                                                                                                             
  format.modal{ render 'index', :layout => 'bare'}                                                                                      
 end  

Я хочу, чтобы этот формат в основном обслуживал те же представления, что и формат .thml, но с другим макетом

Я получаю ошибку отсутствующего шаблона

Missing template support/index with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>[:modal], :locale=>[:en, :en]} in view paths "/remote/app/views",

он ищет представление с именем index.modal.erb в настоящее время у меня есть только index.html.erb

Я попытался создать index.modal.erb, и он работает, но тогда у макета та же проблема, у меня есть только макет вbare.html.erb

Я действительно не хочу дублировать эти файлы представления для различных типов пантомимы.Я надеюсь, что есть способ заставить пользовательский тип MIME вернуться к представлениям HTML, которые мне не хватает.

Ответы [ 2 ]

2 голосов
/ 03 августа 2013

Я иду по вашему требованию, что

Я хочу, чтобы этот формат в основном служил тем же представлениям, что и формат .html, но с другим макетом

У меня другой подход, который должен работать в Rails 3 (проверено в Rails 3.2.12). Поместите в свой контроллер следующее:

  before_filter do
    @bare= (params[:format] == 'modal')

    if @bare
      params[:format]= 'html'
      request.format= :html
    end
  end

  layout :select_layout

  # standard controller stuff

  # ...
  # Towards bottom of your controller code, 
  private
  def select_layout
    @bare ? 'bare' : nil
  end

Резюме:

  • Измените формат обратно на html.
  • Установить переменную, чтобы указать, что она должна обслуживать «голые»
  • Скажите контроллеру, что значение макета будет задано функцией. (См. «Выбор макетов во время выполнения» в http://guides.rubyonrails.org/layouts_and_rendering.html)
  • Никаких изменений не требуется ни в одном из блоков response_to.

Это будет делать именно то, что вам нужно, то есть то же действие, что и .html, но с другим макетом.

0 голосов
/ 23 февраля 2012

Какую версию Rails вы используете? Если 3.2, попробуйте явно установить формат для вашего модального ответа:

respond_to do |format|                                                                                                                                     
  format.html  { render 'index'}                                                                                                                             
  format.modal { render 'index', :formats => [:html], :layout => 'bare'}                                                                                      
end

Это должно сделать так, чтобы он отображал index.html.erb вместо index.modal.erb.

...