1

我正在用 Ruby on Rails 3.1.3 制作一个应用程序。我有不同类型的用户(即管理员、操作员、广告商等),每个用户都有不同的主(或主页)页面。我想制作一个路由助手,通过使用类似home_path. 这主要用于在某些操作后重定向(我想根据用户类型重定向回各自的主页)。

我已经有一些可用的方法,例如current_user(返回当前登录的用户),current_user.admin?(如果当前登录的用户是管理员,则返回 true)current_user.operator?,等等。

现在我正在使用一个辅助方法来做到这一点,但这似乎不是一种非常 Rails 的方式来做到这一点。无论如何,代码如下:

def home_path(params = {})
    user = current_user
    case user
        when user.admin?
            params = {:controller => 'administrators', :action => 'index'}.merge(params)
        when user.advertiser?
            params = {:controller => 'advertisers', :action => 'show', :id => user.advertiser_id}.merge(params)
        when user.operator?
            params = {:controller => 'callcenter', :action => 'index'}.merge(params)
        else
            params = {:controller => 'posts', :action => 'home'}.merge(params)
    end
    url_for(params)
end

我认为这应该通过受约束的路线来完成,但我仍然不明白如何依赖 , 等方法来.admin?完成.operator?。对此的任何帮助将不胜感激。

4

1 回答 1

2

使用辅助方法对此很好。不过,它可能应该最终出现在您的控制器中,而不是视图助手中,这使它可以访问current_user. 通过一些清理,你可以用你现在的想法得到一些不错的东西。

module DefaultHomeHelper
  DEFAULT_PARAMS = { controller: :posts, action: :home }.freeze
  ROLE_SPECIFIC_PARAMS = {
    admin: { controller: :administrators, action: :index },
    advertiser: { controller: :advertisers, action: :show },
    operator: { controller: :callcenter, :action: :index }
  }.freeze

  def home_path(params = {})
    url_for params.reverse_merge(ROLE_SPECIFIC_PARAMS[current_user.role] || DEFAULT_PARAMS)
  end
end

我假设您可以更直接,并要求您的 User 对象只告诉您它的角色,而不是一个接一个地猜测。您几乎肯定需要调整代码以适应您对用户的调用。我还使用了较新的哈希语法,但如果您正在运行或适应 Ruby < 1.9,则需要更新。我也为动作和控制器名称使用了符号,因为我喜欢用符号而不是字符串来引用对象和方法(控制器和动作是对象和方法)。

你可以做一个简单include DefaultHomeHelperApplicationController来使用它。您还可以使用helper_method :home_path.

于 2012-12-27T19:08:01.657 回答