我有一个非常复杂的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部分'?
答案 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