我正在尝试编写一些逻辑,如果用户已登录(因此定义了currentUser
变量,下面的编辑部分中有更多详细信息),他应该无法访问根URL应用程序,即登录页面。我试图在页面加载之前/之后使用重定向到users.show
页面来实现此目的,但我似乎无法弄清楚如何执行此操作。
阅读余烬文档,您可以从路径或控制器进行重定向。我试过了两个,但都没有奏效。在路线:
App.ApplicationRoute = Ember.Route.extend
redirect: ->
currentUser = @controllerFor('Application').get('currentUser') # this works
currentPath = @controllerFor('Application').get('currentPath') # this returns undefined
if currentUser && currentPath == '/'
@transitionTo('users.show', currentUser)
这里的问题是我出于某种原因无法读取currentPath,即使我可以从App.ApplicationController
内访问它。
在控制器中,我尝试过:
App.ApplicationController = Ember.Controller.extend
init: -> # never gets called
if @get('currentUser') && @get('currentPath') == '/'
@transitionToRoute('users.show', @get('currentUser'))
除了在加载页面时永远不会调用init
,我无法从文档中找出在页面加载时调用哪个钩子。
如果代码有任何其他问题,请随时指出。如何修复代码以实现重定向?
编辑:建议路线实施将'application'
更改为@controllerFor('application')
中的小写。试过这个并返回错误
Assertion failed: The controller named 'application' could not be found. Make sure that this route exists and has already been entered at least once. If you are accessing a controller not associated with a route, make sure the controller class is explicitly defined.
不确定是怎么回事,因为对所有小写作品中的其他路线执行@controllerFor
,而不是'application'
。
当前用户变量是通过在ember初始化程序中注入获得的。我在我的后端使用Rails和Devise,并且currentUser
基本上或多或少地ApplicationRoute
进入ember this tutorial。一般流程是Rails - >元标记 - >初始化程序 - >注射。
解决方案:受到接受答案后的讨论的启发,我最终在App.ApplicationRoute = Ember.Route.extend
beforeModel: (transition) ->
currentUser = @controllerFor('currentUser')
if currentUser && transition.targetName == 'index'
@transitionTo('users.show', currentUser)
中这样做了:
{{1}}
答案 0 :(得分:0)
我没有看到您试图从应用程序路径获取应用程序控制器。我不是百分百肯定会工作的。我相信在redirect
被调用之前,在路由过程中很早就会调用setupController
钩子。这意味着您的init
方法不太可能在redirect
挂钩之前被调用。
我有两个可能的解决方案:
似乎currentUser
变量是从某种全局信息创建的。如果是这种情况,请在路线中创建,并在必要时进行转换。如果您仍希望在控制器中注入数据,请使用setupController
挂钩将其放在那里。
如果currentUser
变量恰好是该特定路线的模型,请尝试转换afterModel
挂钩。这样您就可以直接访问数据。
另外,我会尽量避免控制器中的转换。尽可能将它们留在路线中。
如果您可以向我提供有关currentUser
变量来源的更多信息,我可以给您一个更具体的答案。
编辑:这段代码来自您发布的文章:
controller = container.lookup('controller:currentUser').set('content', user)
如果这与您正在使用的相似,请尝试将其注入路线而不是控制器。
controller = container.lookup('route:currentUser').set('currentUserModel', user)
然后,您只需在路线中使用@get('currentUserModel')
即可。并且,如果由于某些原因不起作用,只需将用户置于全局范围内,只是为了确保您没有其他错误。所以不是上面的那一行:
App.TEMP_CURRENT_USER = user;