大家好,一个 web 网站的路由设计十分重要,比如用户上线后都是首页,显示的就不一样. 在比如用户的 dashbord 如何设计是作为 resouce 还是一个 action. 大家有没有这方面的实践经验分享一下 Rails 如何把一个 path 有条件的路由到不同的 controller#action?, 比如把 dashbord 根据不同的角色分别路由到teacher#dashbord和student#dashbord?
能不能判断身份之后 redirect_to 不同的路径,或者 render 不同的 layout
#1 楼 @w7938940 #2 楼 @hww 这样就会多一次交互,
#3 楼 @lilijreey 判断 render 不同 template 只多一次判断。
这个可以在 routes 里实现,前提是可以在 session 里提取到用户的信息,如果你用的是 devise 或者 warden,用户信息是可以在 session 里提取的。然后可以用 constraints 来 match。
# routes.rb constraints(TeacherConstrainer.new) do namespace :teacher do resource :dashboard end end constraints(StudentConstrainer.new) do namespace :student do resource :dashboard end end # teacher_constrainer.rb class TeacherConstrainer def matches?(request) # 首先需要确定是不是已经登录了 return false unless request.env["warden"].authenticate? user = request.env["warden"].user # 自定义逻辑来确定用户是不是Teacher, eg: Rolify user.has_role? :teacher end end # student_constrainer.rb class StudentConstrainer def matches?(request) # 首先需要确定是不是已经登录了 return false unless request.env["warden"].authenticate? user = request.env["warden"].user # 自定义逻辑来确定用户是不是Student, eg: Rolify user.has_role? :student end end
#5 楼 @mengqing 感谢 这个用法好高级,都没有见到过. 讲 Rails 的书基本都看完了,大多数讲的东西太浅,其实什么都做不了. 就一本还可以,The Rails Way.对于学习 Rails 有没有什么建议呢?亲
#5 楼 @mengqing 👍 custom constraints 的方式确实很赞
#6 楼 @lilijreey http://guides.rubyonrails.org/routing.html#advanced-constraints 你可以多看看文档