Можно ли загрузить помощник Rails во время выполнения?

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

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

class MyController < ApplicationController

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

etc...

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

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

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

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

ТИА: Джон


person John    schedule 27.12.2008    source источник
comment
Ах, почтенный образец состояния: en.wikipedia.org/wiki/State_pattern - один из моих избранное! Хотел бы я знать RoR, чтобы я мог помочь.   -  person Jarrod Dixon♦    schedule 27.12.2008


Ответы (2)


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

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

<% 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

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

person csexton    schedule 27.12.2008

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

Если у кого-то не возникнет блестящая идея, которая изменит мое мнение, я откажусь от этого вопроса до конца дня.

-- Джон

person John    schedule 27.12.2008