Rails中相同控制器操作的不同行为

时间:2009-12-25 02:34:44

标签: ruby-on-rails controller action

说,我在其中一个控制器中有这个:

  def show
    case current_user.role
      when 'manager'
       render :text => 'Manager view!'
      when 'admin'
       render :text => 'Admin view!'
    end
  end

问题是,当然,代替“渲染”,有一堆代码,它们看起来非常快。此外,我的控制器中还有其他一些操作,这些操作必须对每个用户角色执行不同的操作。重构它的最佳方法是什么,而不必在动作的主体中写出一些“ifs”和“case”?我想要2个文件 - 每个用户角色一个;或至少两种不同的行为。

1 个答案:

答案 0 :(得分:1)

如果2个变体明显不同并且必须从同一个控制器调用,则可以使用around_filter并将controller.action_name分配给从同一个基础继承的2个类之一。

如果2种变化没有那么不同,以至于它们需要分叉,ifs应该没问题......

对于调度,它可能只是从基类继承的泛型类。您可以在过滤器中使用基于角色创建正确对象的开关,然后最终在对象上发送(“#{action}”)。我只会这样做,如果变化是如此不同,他们应该得到2个派生类。

现在除了泛型类之外,您还可以使用方便的Components w / render_component方法。在大多数情况下,调度到组件控制器的开销可以忽略不计。 (这有点像.net中的服务器端传输(Server.Transfer)。)