如何在Ruby on Rails中路由匹配后更改URL

时间:2015-07-05 04:00:21

标签: ruby-on-rails ruby routing

我已经在Ruby on Rails中编程了一段时间,但直到最近才开始深入研究路由。在阅读了大量文档和谷歌搜索后,我还没有能够回答这个问题。

匹配路由后如何更改URL?为了更好地解释这一点,让我设定一个我试图解决的场景。测试时我的网站的根目录是localhost:3000。我的登录页面是localhost:3000 / login。登录后,我希望URL再次读取localhost:3000而没有扩展名。实际的页面名称是仪表板,我的路线目前如下。

get 'dashboard' => 'user#dashboard'

这仅在URL为localhost:3000 / dashboard时才匹配,但我不想像许多网站那样拥有更清晰的URL。如何通过Ruby On Rails实现这一目标?我想避免使用JavaScript解决方案或任何解决方法。

非常感谢任何帮助或提示。非常感谢提前。

2 个答案:

答案 0 :(得分:1)

我已经提供了以下解决方案,但我同意max,您希望使RESTful URL不那么有意义的是倒退。您应该努力为网址添加别名以使其更有意义(例如从site.com/posts/34239482069472/site.com/posts/my-post-title)。

地址栏中显示的URL是对应用的说明。当用户将“site.com/dashboard”放入地址栏时,他们会指示应用发出HTTP请求get 'dashboard'。 Controller#action是应用程序在收到请求时执行的一组指令。如果您遵循Rails命名约定,则Users#dashboard将检索数据,然后默认情况下在views/users/dashboard.html.erb呈现视图模板。理解这一点:您没有更改给定视图的URL,而是更改为该URL设置的Controller#操作呈现的视图模板。

这意味着root_url的Controller#操作(即root to: 'controller#action'中的config/routes.rb)应该在用户登录时呈现一个视图模板,如果用户未登录则呈现不同的视图模板。假设root to: welcome#index,您的控制器操作将如下所示:

app/controllers/welcome_controller.rb

def index
  # db queries, logic, set @variables

  if session[:user_id]
    render "users/dashboard" # app/views/users/dashboard.html.erb
  else
    render "index" # app/views/welcome/index.html.erb
  end
end

请注意,如果要渲染的视图模板对应于控制器,例如users_controller.rb操作正在views/users呈现视图,您只需要提供视图名称,否则您需要提供路径(相对于app/views)。

答案 1 :(得分:0)

为什么呢? /dashboard是资源的正确RESTful定义。在REST中,路由应具有独立于状态的相同响应。因此,为登录用户创建完全不同的根页面会违反REST。

此外,您的用户可能还想访问索引页面以及仪表板,您可能会拒绝他们这种可能性。

这种URL微优化不保证将一堆状态黑客入路由定义。