2012-01-18 2 views
0

У меня есть действие контроллера users/create, что довольно сложно, отчасти потому, что он создает один из трех типов пользователей, каждый из которых имеет свои собственные записи и устанавливает требования. Представьте себе, например, форму, в которой могут быть созданы Worker, a Company и Contractor, и каждая из них имеет собственную маршрутизацию и отправляет собственное электронное письмо на основе успешного или неудачного создания.Пропуск и подключение секций кода контроллера

Несмотря на лучшие намерения, результатом является значительное число следующих:

if x 
    flash[:notice] = abc 
    redirect_to :action => "new", :layout => "notice" 
elsif y 
    flash[:notice] = def 
    redirect_to :action => "new", :layout => "notice" 
elsif z 
    flash[:notice] = ghi 
    redirect_to :action => "somethingelse", :layout => "else" 
etc. 

теперь у меня есть требование, которое изменяет повторяющееся :action => 'new' к еще одной мишени на основе значения Params.

Есть ли способ уменьшить эту избыточность, говоря, по сути, «Перейти к разделу 2»?

+0

я не понял ваш вопрос, вы были слишком общий характер. перемещение всей этой логики в вспомогательные методы поможет. ваши контроллеры должны оставаться стройными –

ответ

0

Не мог бы это сделать оператор switch/case?

switch(val) { 
    case 'x': 
    case 'y': 
    case 'z': 
    // they all perform the same action 
    break; 
} 
0

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

Например, вы могли бы:

helper_method :new_user_message, :new_user_route 

    def create 
    if @user.save 
     flash[:notice] = new_user_message(@user) 
     redirect_to new_user_route(@user) 
    end 
    end 

    def new_user_message(user) 
    case user.role 
     when x then 'Successful x message' 
     when y then 'Successful y message' 
     when x then 'Successful z message' 
    end 
    end 

    def new_user_route(user) 
    case user.role 
     when x then new_x_path 
     when y then new_y_path 
     when z then new_z_path 
    end 
    end 
Смежные вопросы