问题描述
|
我想根据用户是否是艺术家来设置路线。因此,例如:
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