Можно ли загрузить помощник Rails во время выполнения? - PullRequest
4 голосов
/ 27 декабря 2008

У меня есть представление, которое может значительно различаться в зависимости от режима, выбранного конкретным пользователем.

Я думал, что извлеку различное поведение в двух разных помощников, а затем получу такой код в контроллере:

class MyController < ApplicationController

case mode
when 'mode1'
  helper "mode1"
when 'mode2'
  helper "mode2"
else
  raise "Invalid mode"
end

etc...

Как только правильный помощник загружен, оператор типа <% = edit_item%>, который определен в обоих помощниках, загрузит правильную форму для определенного «режима».

Это прекрасно работает в разработке, но в производстве оператор case запускается только один раз. Тогда вы застряли с тем помощником, который был загружен первым (да! Я должен был это знать.)

Я думал о других способах достижения того, что мне нужно сделать, но я все еще думаю, что это использование помощников - хороший чистый способ изменить поведение представления.

Кто-нибудь знает, как я могу загрузить (или перезагрузить) помощника во время выполнения?

TIA: Джон

Ответы [ 2 ]

1 голос
/ 28 декабря 2008

Я могу придумать несколько способов сделать это, но не уверен насчет загрузки модулей, как вы предлагали.

Загрузка различных частичек и выбор загружаемых в зависимости от состояния.

<% if @mode = 'mode1 %>
  Mode 1:
  <%= render :partial => 'mode1' %>
<% else %>
  Mode 2:
  <%= render :partial => 'mode2' %>
<% end %>

Или, если вы хотите сохранить эту логику вне поля зрения (что может быть хорошо), вы можете поместить что-то в свой контроллер для выполнения различных действий в зависимости от режима:

def index
   @mode = params[:query]
   case @mode
     when 'mode1' then render :action => "mode1"
     when 'mode2' then render :action => "mode2"
     else raise "Invalid mode"
   end
end

Что кажется намного лучше, чем показывать эту логику.

1 голос
/ 27 декабря 2008

После некоторого изучения этого вопроса я начинаю думать, что это глупая идея ... Последствия замены модулей во время выполнения в многопользовательской системе выглядят не очень хорошо.

Если кто-то не придет с яркой идеей, которая передумает, я вернусь к этому вопросу к концу дня.

- Джон

...