我想根据用户是艺术家来设置我的路线。例如,像:
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。但是,上面代码的逻辑解释了我的意图。
有没有办法实现这个目标?
答案 0 :(得分:0)
从你拥有它看起来你已经建立了一个名为艺术家的角色。要使current_user方法有效,您需要做的就是:在您的帐户控制器中,您可以设置一个前置过滤器,例如说before_filter:check_user_role:only => :账户设置。然后,您可以为各种角色及其各种redirects_to调用方法设置您的account_settings。我正在做一个类似的项目,它对我有用。我希望这可以帮助你
答案 1 :(得分:0)
路由表不会在特定用户的上下文中运行。这是因为它在到达会话管理代码之前路由请求,因此它无法分辨当前用户是谁。
我可以想到两个解决方案:
答案 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