Почему Rails рендерит шаблоны RJS в макете? - PullRequest
1 голос
/ 11 сентября 2011

Мне нужно сделать это для контроллера, который использует гем active_scaffold. У нас есть контроллер, который выглядел примерно так:

class Admin::UsersController < ApplicationController
   layout 'admin'

   active_scaffold :users do |config|
     config.search.columns = [:first_name, :last_name]
   end
end

Это прекрасно работало, когда мы работали на Rails 2.3.10, но мы обновляем до Rails 3.0.10. В рамках обновления мне пришлось обновить active_scaffold (в настоящее время установленное из rails-3.0 ветви git://github.com/activescaffold/active_scaffold), чтобы быть совместимым. Одна проблема, с которой мы столкнулись, это то, что поиск по таблице не работал. Я бы увидел в моих файлах журнала:

Rendered <snip>/gems/active_scaffold-25b3d724f35b/frontends/default/views/list.js.rjs within layouts/admin (923.5ms)

Обратите внимание, что он рендерит шаблон RJS с макетом, указанным в контроллере. Это кажется необоснованным дефолтом для меня. Разве шаблоны RJS не должны отображать без макет по умолчанию ? Во всяком случае, я исправил это так:

class Admin::UsersController < ApplicationController
  layout :admin_layout

  private

  def admin_layout
    respond_to do |format|
      format.js   { false }
      format.html { 'admin' }
    end
  end
end

Это исправляет проблемы с поиском и нумерацией страниц. (Шаблон RJS теперь отображается без макета, поэтому браузер может выполнить полученный Javascript). Наверное, мой вопрос: почему я должен сказать Rails, что он не должен рендерить шаблоны RJS с макетами? И есть ли лучшее решение? Мне кажется, что это слишком много для хака (плохой вид хака - взлом, который сломается в будущем).

Ответы [ 2 ]

4 голосов
/ 11 сентября 2011

Хорошо, я понял это.Комментарий @ numbers1311407 под моим вопросом заставил меня проверить название шаблона макета.Это было layouts/admin.haml.В Rails 2 этот макет рендерился только для запросов HTML, но в Rails 3 он применяется ко всем запросам (поскольку не указывает тип формата).Я переименовал его в layouts/admin.html.haml, и он работает с простым layout 'admin' в моем контроллере (в отличие от хака, который я придумал в своем вопросе).

Так что ответ на вопрос "Почему Rails рендерит шаблоны RJS в макете? "файл макета был назван так, что он применяется ко всем форматам.

0 голосов
/ 11 сентября 2011

Ответьте на свои вопросы:
1. Нет ничего волшебного в том, что Rails рендеринг макет для формата JS. Это потому, что по умолчанию Rails отображает макет с любым шаблоном, если вы явно не укажете его избегать. Вы можете просто посмотреть на источники Rails в файле: actionpack/lib/action_controller/metal/renderers.rb, чтобы увидеть: js renderer.

2. Попробуйте использовать:

respond_to do |format|
  format.js { render *your_any_options*, layout: false }
end
...