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

lilijreey · 2016年10月02日 · 最后由 jpman 回复于 2016年10月08日 · 3153 次阅读

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

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

2 楼 已删除

#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 的方式确实很赞

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