我已经在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解决方案或任何解决方法。
非常感谢任何帮助或提示。非常感谢提前。
答案 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微优化不保证将一堆状态黑客入路由定义。