2009-12-25 4 views
0

Say, у меня есть это в одном из контроллеров:различное поведение для того же действия контроллера в Rails

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

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

ответ

1

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

если 2 вариации не настолько различны, что они требуют разветвление, сослагательного наклонения должно быть прекрасно ...

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

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

+0

Не могли бы вы указать часть диспетчеризации и наследования? Как бы это выглядело в этом случае? Я не уверен. – snitko

Смежные вопросы