说,我在其中一个控制器中有这个:
def show
case current_user.role
when 'manager'
render :text => 'Manager view!'
when 'admin'
render :text => 'Admin view!'
end
end
问题是,当然,代替“渲染”,有一堆代码,它们看起来非常快。此外,我的控制器中还有其他一些操作,这些操作必须对每个用户角色执行不同的操作。重构它的最佳方法是什么,而不必在动作的主体中写出一些“ifs”和“case”?我想要2个文件 - 每个用户角色一个;或至少两种不同的行为。
答案 0 :(得分:1)
如果2个变体明显不同并且必须从同一个控制器调用,则可以使用around_filter并将controller.action_name分配给从同一个基础继承的2个类之一。
如果2种变化没有那么不同,以至于它们需要分叉,ifs应该没问题......
对于调度,它可能只是从基类继承的泛型类。您可以在过滤器中使用基于角色创建正确对象的开关,然后最终在对象上发送(“#{action}”)。我只会这样做,如果变化是如此不同,他们应该得到2个派生类。
现在除了泛型类之外,您还可以使用方便的Components w / render_component方法。在大多数情况下,调度到组件控制器的开销可以忽略不计。 (这有点像.net中的服务器端传输(Server.Transfer)。)