Rails Ruby 路由匹配后如何更改 URL
How to change URL after route match in Ruby on Rails
我在 Rails 上的 Ruby 编程已经有一段时间了,但直到最近才真正深入研究路由。在阅读了大量文档和谷歌搜索后,我无法回答这个问题。
路由匹配后如何修改URL?为了更好地解释这一点,让我设置一个我试图解决的场景。测试时我网站的根是 localhost:3000。我的登录页面是 localhost:3000/login。不过,一旦登录,我希望 URL 再次读取 localhost:3000 且没有扩展名。实际页面名称是dashboard,目前我的路线如下
get 'dashboard' => 'user#dashboard'
这仅在 URL 是 localhost:3000/dashboard 时才匹配,但我不想像很多网站那样拥有更干净的 URL。 Ruby On Rails 是如何实现的?我想避免 javascript 解决方案或任何解决方法。
非常感谢任何帮助或提示。非常感谢。
为什么? /dashboard
是资源的正确 RESTful 定义。在 REST 中,路由应该具有与状态无关的相同响应。因此,为登录用户提供完全不同的根页面违反了 REST。
此外,您的用户可能希望访问索引页和仪表板,而您会拒绝他们这种可能性。
这些 URL 微优化不保证在您的路由定义中加入一堆状态。
我在下面提供了解决方案,但我同意 max 的观点,即您想让 RESTful URL 变得不那么有意义是倒退的。您应该努力为 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#action 呈现的视图模板。
这意味着您的 root_url 的 Controller#action(即 config/routes.rb
中的 root to: 'controller#action'
)应该在用户登录时呈现一个视图模板,而在用户登录时呈现不同的视图模板用户未登录。假设 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
action是在views/users
中渲染一个视图,那么你只需要给出视图名称,否则你需要给出一个路径(相对于app/views
)。
我在 Rails 上的 Ruby 编程已经有一段时间了,但直到最近才真正深入研究路由。在阅读了大量文档和谷歌搜索后,我无法回答这个问题。
路由匹配后如何修改URL?为了更好地解释这一点,让我设置一个我试图解决的场景。测试时我网站的根是 localhost:3000。我的登录页面是 localhost:3000/login。不过,一旦登录,我希望 URL 再次读取 localhost:3000 且没有扩展名。实际页面名称是dashboard,目前我的路线如下
get 'dashboard' => 'user#dashboard'
这仅在 URL 是 localhost:3000/dashboard 时才匹配,但我不想像很多网站那样拥有更干净的 URL。 Ruby On Rails 是如何实现的?我想避免 javascript 解决方案或任何解决方法。
非常感谢任何帮助或提示。非常感谢。
为什么? /dashboard
是资源的正确 RESTful 定义。在 REST 中,路由应该具有与状态无关的相同响应。因此,为登录用户提供完全不同的根页面违反了 REST。
此外,您的用户可能希望访问索引页和仪表板,而您会拒绝他们这种可能性。
这些 URL 微优化不保证在您的路由定义中加入一堆状态。
我在下面提供了解决方案,但我同意 max 的观点,即您想让 RESTful URL 变得不那么有意义是倒退的。您应该努力为 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#action 呈现的视图模板。
这意味着您的 root_url 的 Controller#action(即 config/routes.rb
中的 root to: 'controller#action'
)应该在用户登录时呈现一个视图模板,而在用户登录时呈现不同的视图模板用户未登录。假设 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
action是在views/users
中渲染一个视图,那么你只需要给出视图名称,否则你需要给出一个路径(相对于app/views
)。