0

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

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

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

4

1 回答 1

1

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

如果 2 个变体没有太大差异以至于它们需要分叉,那么 ifs 应该没问题......

对于调度,它可能只是一个从基类继承的泛型类。你可以在你的过滤器中有一个开关,根据角色创建正确的对象,然后最后在对象上发送(“#{action}”)。我只会在变化如此不同以至于它们值得 2 个派生类的情况下这样做。

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

于 2009-12-25T03:13:21.937 回答