根据用户是否为艺术家进行路由

问题描述

| 我想根据用户是否是艺术家来设置路线。因此,例如:
namespace \'dashboard\' do
    if current_user.is_artist
       get \'/settings\',:to => \'users#edit\',:as => \'account_settings\'
       put \'/settings\',:to => \'users#update\',:as => \'account_settings\'
       delete \'/settings\',:to => \'users#destroy\',:as => \'account_settings\'
    else
       get \'/settings\',:to => \'artists#edit\',:to => \'artists#update\',:to => \'artists#destroy\',:as => \'account_settings\'
    end
end
不幸的是,我无法在routes.rb中访问current_user。但是,上面代码的逻辑解释了我的意图。 有没有办法可以做到这一点?     

解决方法

路由表不在特定用户的上下文中运行。这是因为它会在到达会话管理代码之前路由请求,因此无法告诉谁是当前用户。 我可以想到两种解决方案: 如果用户是艺术家,则通过某种方法来渲染设置链接,该方法会重写它们。这样,“艺术家”和“用户”将获得不同的URL。 向您的UserSettings控制器添加一个before_filter,以捕获来自艺术家的请求并将其重定向到ArtistSettings(不确定您的内部结构,但您可能会了解一般想法)。     ,从您拥有的内容来看,您似乎已经建立了一个称为艺术家的角色。要使current_user方法正常工作,您要做的就是:在您的帐户控制器中,您可以设置一个before过滤器,例如说before_filter:check_user_role:only =>:account_setting。那么您将为各种角色及其所具有的redirects_to调用方法设置account_settings。我正在从事类似的项目,并且对我有用。我希望这可以帮助你     ,您可以创建一个中间件,在将其打到实际应用程序之前,先将用户弄清楚。例如,这就是管理员/设计人员正在做的事情。将用户对象添加到env变量中,然后可以在堆栈中较低的位置访问它。     ,您的路由文件仅根据URL确定正在调用哪个控制器动作。您可以将艺术家和用户都映射到单个控制器,然后通过查看用户将要在哪个控制器中渲染的屏幕放置在逻辑中。默认情况下,控制器会渲染基于控制器和方法名称的视图,但是您可以随意覆盖它并渲染所需的任何视图。使用您的路线将请求分派到适当的edit / update / destroy操作,并将用户/艺术家逻辑放入这些操作中,以呈现users / edit.html.haml或artist / edit.html.haml文件...     ,正如埃拉德(Elad)解释的那样,路由本身无法确定当前用户是否是艺术家。 如果要使用两个不同的行为和视图来保留单个url,则可以使用单个控制器,例如:
def settings
    if current_user.is_artist
        do something
        render :action => \"artist_settings\"
    else
        do something else
        render :action => \"users_settings\"
    end      
end