如何将orders路由请求重定向至new_orders控制器?
解决方案
当然可以把发往orders的请求转到new_orders的控制器处理,你之前用redirect的写法存在问题,导致前端拿不到数据,具体原因:
redirect('/new_orders')属于HTTP外部重定向,会返回3xx状态码,前端AJAX请求如果未处理重定向响应,不会自动获取新地址的返回数据;- 针对POST类型的
create请求,默认302重定向会把请求方法改为GET,导致原POST提交的创建参数丢失,新控制器无法拿到数据。
推荐采用内部转发的方式,直接让旧路由映射到新控制器的动作,前端完全无感知,也不会出现数据丢失问题:
写法1:直接映射路由
替换原来的resources :orders, only: [:index, :create],改成:
get '/orders', to: 'new_orders#index' post '/orders', to: 'new_orders#create'
写法2:用resources集合路由
如果想保留resources的结构,也可以这么写:
resources :orders, only: [] do collection do get '', to: 'new_orders#index' post '', to: 'new_orders#create' end end
如果确实需要让前端地址栏跳转至new_orders(比如SEO需求),可以使用带状态码的重定向,确保POST请求保留原方法和数据:
get '/orders', to: redirect('/new_orders') post '/orders', to: redirect('/new_orders', status: 307)
注意:307重定向需要前端AJAX库支持处理,否则仍可能无法正常获取数据,因此优先选择内部转发方案。
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

