Разное поведение для одного и того же действия контроллера в Rails - PullRequest
0 голосов
/ 25 декабря 2009

Скажите, у меня есть это в одном из контроллеров:

  def show
    case current_user.role
      when 'manager'
       render :text => 'Manager view!'
      when 'admin'
       render :text => 'Admin view!'
    end
  end

Дело в том, что вместо 'render', конечно, есть куча кода, и все это выглядит довольно быстро. Кроме того, у меня есть некоторые другие действия в моем контроллере, которые должны выполняться по-разному для каждой роли пользователя. Каков наилучший способ его рефакторинга без необходимости писать какие-то «если» и «дела» в теле действия? Я хотел бы иметь 2 файла - по одному для каждой роли пользователя; или хотя бы два разных действия.

1 Ответ

1 голос
/ 25 декабря 2009

, если 2 варианта значительно отличаются и должны вызываться с одного и того же контроллера, вы можете использовать around_filter и отправить имя controller.action_name одному из 2 классов, которые наследуются от одной базы. *

если 2 варианта не настолько различны, что требуют разветвления, если все будет хорошо ...

для диспетчеризации, это может быть просто универсальный класс, который наследуется от базового класса. в вашем фильтре может быть переключатель, который создает правильный объект на основе роли, а затем, наконец, отправляет («# {action}») объект. я сделал бы это только в том случае, если вариации настолько различны, что они заслуживают двух производных классов.

теперь, кроме общих классов, вы также можете использовать удобный Components w / метод render_component. в большинстве случаев накладные расходы на диспетчеризацию компонентного контроллера были бы весьма незначительными. (это похоже на передачу на стороне сервера (Server.Transfer) в .net.)

...