Пропуск и подключение разделов кода контроллера - PullRequest
0 голосов
/ 18 января 2012

У меня есть users/create действие контроллера, которое довольно сложно, отчасти потому, что оно создает одного из трех типов пользователей, у каждого из которых есть свои собственные связанные записи и устанавливаются требования.Представьте, например, форму, в которой могут быть созданы Worker, 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' на еще одну цель, основанную на значении параметра.

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

Ответы [ 2 ]

0 голосов
/ 18 января 2012

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

Например, вы можете иметь:

  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
0 голосов
/ 18 января 2012

Не будет ли оператор switch / case делать это?

switch(val) {
  case 'x':
  case 'y':
  case 'z':
    // they all perform the same action
    break;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...