跳过并连接控制器代码的各个部分

时间:2012-01-18 03:29:32

标签: ruby-on-rails ruby-on-rails-3

我有一个非常复杂的users/create控制器操作,部分原因是它创建了三种类型的用户之一,每种用户都有自己的相关记录和设置要求。想象一下,例如,可以创建WorkerCompanyContractor的表单,每个表单都有自己的路由,并根据成功发送自己的电子邮件与失败的创造。

尽管有最好的意图,结果还是有以下几点:

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 :(得分:0)

交换机/案例声明不会这样做吗?

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

答案 1 :(得分: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