新手问题 有关 Rails 路由设计的最佳实践

lilijreey · 发布于 2016年10月02日 · 最后由 jpman 回复于 2016年10月08日 · 1479 次阅读
24996

大家好,一个web网站的路由设计十分重要,比如用户上线后都是首页,显示的就不一样. 在比如用户的dashbord 如何设计是作为resouce还是一个action. 大家有没有这方面的实践经验分享一下 Rails如何把一个path 有条件的路由到不同的controller#action?, 比如把dashbord 根据不同的角色分别路由到teacher#dashbord和student#dashbord?

共收到 7 条回复
96

能不能判断身份之后redirect_to不同的路径,或者render不同的layout

2楼 已删除
24996

#1楼 @w7938940 #2楼 @hww 这样就会多一次交互,

4933

#3楼 @lilijreey 判断render不同template 只多一次判断。

13587

这个可以在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
24996

#5楼 @mengqing 感谢👍 这个用法好高级,都没有见到过. 讲Rails的书基本都看完了,大多数讲的东西太浅,其实什么都做不了. 就一本还可以,The Rails Way.对于学习Rails有没有什么建议呢?亲

14293

#5楼 @mengqing 👍 custom constraints 的方式确实很赞

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册