Как я могу использовать разные шаблоны RJS от одного контроллера rails? - PullRequest
2 голосов
/ 10 октября 2008

У меня есть метод контроллера, который возвращает список для раскрывающегося списка, который отображается в частичном, но в зависимости от того, где используется частичное, шаблон RJS должен отличаться. Могу ли я передать в контроллер параметр, который определит, какой RJS будет использоваться?

Вот метод контроллера, он очень прост:

def services
   respond_to do |format|
     format.js {
       @type     = HospitalCriteria.find_by_id(params[:type_id])
       @services = @type.children.all
     }
   end
end

А вот шаблон rjs, который обрабатывается автоматически

page.replace_html 'select_service', :partial => 'hospital/services'
page.replace_html 'select_condition', :partial => 'hospital/conditions'
page.replace_html 'select_procedure', :partial => 'hospital/procedures'

page << 'if ($("chosenType") != null) {'
  page.replace_html 'chosenType', @type.name
  page.replace_html 'chosenService', 'Selected Service'
  page.replace_html 'chosenCondition', 'Selected Condition'
  page.replace_html 'chosenProcedure', 'Selected Procedure'
page << '}'

Ответы [ 4 ]

3 голосов
/ 11 октября 2008

Мне нравится ответ Майка, но есть над чем подумать с точки зрения дизайна:

Мне кажется, что это должно быть на уровне представления - если действие семантически одинаково, но представление отличается, возможно, с двумя разными частями rjs и выполнение чего-то подобного ниже более совместимо с MVC?

if params[:use_alternate]
  render :partial => "case_1.rjs"
else
  render :partial => "case_2.rjs"
end
2 голосов
/ 13 октября 2008

Как насчет размещения условной логики в одном шаблоне rjs?

# services.rjs

if @type == "your conditions"
  # your rjs updates
else
  # your other rjs updates
end

Это дает вам более чистый контроллер и избавляет вас от головной боли от поддержки нескольких шаблонов rjs.

1 голос
/ 11 октября 2008

что-то вроде:

if params[:use_alternate]
  render :template => alternate.rjs and return
end
0 голосов
/ 11 октября 2008

Чтобы сохранить вещи в чистоте, у меня было бы два метода контроллера, которые рендерит два разных RJS. Затем я бы установил @type и @services в общем защищенном методе, который вызывают два метода контроллера.

По-моему, вы просите что-то свое в каждом случае, поэтому вызывайте другой метод контроллера. Передача флага для изменения метода работы - это просто хак, и он не будет хорошо масштабироваться, если у вас 3, 4 или 5 мест. Даже если вы сгенерируете больше кода, его будет проще поддерживать.

...