路线取决于用户是否为艺术家

时间:2011-04-13 11:11:14

标签: ruby-on-rails

我想根据用户是艺术家来设置我的路线。例如,像:

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', :as => 'account_settings'
       put '/settings', :to => 'artists#update', :as => 'account_settings'
       delete '/settings', :to => 'artists#destroy', :as => 'account_settings'
    end
end

不幸的是,我无法访问routes.rb中的current_user。但是,上面代码的逻辑解释了我的意图。

有没有办法实现这个目标?

5 个答案:

答案 0 :(得分:0)

从你拥有它看起来你已经建立了一个名为艺术家的角色。要使current_user方法有效,您需要做的就是:在您的帐户控制器中,您可以设置一个前置过滤器,例如说before_filter:check_user_role:only => :账户设置。然后,您可以为各种角色及其各种redirects_to调用方法设置您的account_settings。我正在做一个类似的项目,它对我有用。我希望这可以帮助你

答案 1 :(得分:0)

路由表不会在特定用户的上下文中运行。这是因为它在到达会话管理代码之前路由请求,因此它无法分辨当前用户是谁。

我可以想到两个解决方案:

  1. 通过某些方法渲染设置链接,如果用户是艺术家,则会重写这些链接。这样“艺术家”和“用户”就可以获得不同的网址。
  2. 将一个before_filter添加到UserSettings控制器,该控制器捕获艺术家的请求并将其重定向到ArtistSettings(不确定您的内部结构,但您可能会得到一般的想法)。

答案 2 :(得分:0)

您可以创建一个中间件,在达到实际应用程序之前在一个级别上计算出用户。这就是warden / devise正在做的事情。将用户对象添加到env变量,您可以在堆栈中较低的位置访问它。

答案 3 :(得分:0)

您的路由文件只是根据URL确定调用哪个控制器操作。您可以将艺术家和用户映射到单个控制器,并通过查看用户放置要在该控制器中呈现的屏幕的逻辑。默认情况下,控制器呈现基于控制器和方法名称的视图,但您可以自由地覆盖它并呈现所需的任何视图。使用您的路线将请求发送到相应的编辑/更新/销毁操作,并将您的用户/艺术家逻辑放入这些操作中,以呈现users / edit.html.haml或artists / edit.html.haml文件...

答案 4 :(得分:0)

正如Elad所解释的那样,路由本身无法判断当前用户是否是艺术家。

如果您想保留一个包含两个不同行为和视图的网址,您可以使用单个控制器,例如:

def settings
    if current_user.is_artist
        do something
        render :action => "artist_settings"
    else
        do something else
        render :action => "users_settings"
    end      
end