【问题标题】:Incorrect route for DELETE methodDELETE 方法的路径不正确
【发布时间】:2014-05-05 15:34:28
【问题描述】:

出于某种原因,slide_path 给了我/slides/1.1 用于 DELETE 方法而不是/albums/1/slides/1。提前感谢任何建议为什么会发生或/以及如何解决它。

我的规范失败:

 1) Slide Pages Delete slide
     Failure/Error: expect{page.find('.btn.btn-mini.btn-danger').click}.to change(Slide, :count).by(-1)
     ActionController::RoutingError:
       No route matches [DELETE] "/slides/1.1"
     # ./spec/features/slides_spec.rb:78:in `block (3 levels) in <top (required)>'
     # ./spec/features/slides_spec.rb:78:in `block (2 levels) in <top (required)>'

规格:

 scenario "Delete slide" do
    visit album_slides_url slide.album
    expect{page.find('.btn.btn-mini.btn-danger').click}.to change(Slide, :count).by(-1)
  end

查看:

    <%= link_to t('.destroy', :default => t("helpers.links.destroy")),
    slide_path(slide.album.id, slide.id),
    :method => :delete,
    :class => 'btn btn-mini btn-danger',
    :remote => true %>

rake 路线:

  slide GET      /slides/:id(.:format)                                             slides#show
        PATCH    /slides/:id(.:format)                                             slides#update
        PUT      /slides/:id(.:format)                                             slides#update
        DELETE   /albums/:album_id/slides/:ids(.:format)                           slides#destroy # this is the one I expect to get
        PATCH    /albums/:album_id/slides/:ids/dest_album/:dest_album_id(.:format) slides#move
        PUT      /albums/:album_id/slides/:ids/dest_album/:dest_album_id(.:format) slides#move

routes.rb

  resources :albums, except: :show do
    resources :slides, shallow: true, except: [:destroy, :patch, :put]    
    match 'slides/:ids', to: 'slides#destroy', via: :delete
    match 'slides/:ids/dest_album/:dest_album_id', to: 'slides#move', via: :patch
    match 'slides/:ids/dest_album/:dest_album_id', to: 'slides#move', via: :put
  end

【问题讨论】:

    标签: ruby-on-rails routes restful-url


    【解决方案1】:

    根据您定义的路由,DELETE 路由不是命名路由,因此当您在链接中说 slide_path(slide.album.id, slide.id) 时,rails 路由会自动尝试将其与前缀为 slideDELETE 请求。

    要将删除幻灯片链接正确路由到 DELETE 路由,您需要按如下方式更新路由:

    resources :albums, except: :show do
      resources :slides, shallow: true, except: [:destroy, :patch, :put]    
      match 'slides/:ids', to: 'slides#destroy', via: :delete, as: :slide ## Note as option
      match 'slides/:ids/dest_album/:dest_album_id', to: 'slides#move', via: :patch
      match 'slides/:ids/dest_album/:dest_album_id', to: 'slides#move', via: :put
    end
    

    这将创建DELETE 命名路由,如下所示:

    album_slide DELETE /albums/:album_id/slides/:ids(.:format)  slides#destroy
    

    现在,更新删除幻灯片链接以映射到此路线:

    <%= link_to t('.destroy', :default => t("helpers.links.destroy")),
        album_slide_path(slide.album.id, slide.id),
        :method => :delete,
        :class => 'btn btn-mini btn-danger',
        :remote => true %>
    

    更新

    您的路线不是命名路线。根据您当前定义的路线,slide_path 仅适用于以下路线:

      slide GET      /slides/:id(.:format)                                             slides#show
            PATCH    /slides/:id(.:format)                                             slides#update
            PUT      /slides/:id(.:format)       
    

    resources :slides, shallow: true, except: [:destroy, :patch, :put]创建的

    因此,当您使用两个参数调用 slide_path(slide.album.id, slide.id) 时,rails 路由器尝试将其转换为路径

    /slides/:id(.:format) 
    

    所以你收到了一个带有路径的请求

    slides/1.1 
           ^ ^
           a b
    

    在哪里

    a => 指的是 slide_path 路由的 :id 动态段,并设置了 slide.album.id 的值

    b => 指的是 slide_path 路由的(.:format) 部分,slide.id 的值被设置为它。格式是指扩展名(.html、.json 等),因此您在路径中收到 .1,因为 slide.id 被视为 format

    【讨论】:

    • 这是否意味着为不同的Verb创建具有不同URI Pattern但相同Prefix的路由(如rake routes命名列)总是不正确的?
    • 阅读我的回答中的UPDATE 部分。
    • yeye,我完全理解它为什么会这样工作,但我现在要问的是,是否存在可以为一个命名路由创建更多不同 URI 模式的情况?换句话说,如果“如果你想要拥有不同的 URI,那么总是必须使用不同的命名路由”是真的吗?
    • 是的..这是真的。如果您要离开Rails ways,则不能这样做。仅当您使用 Rails RESTful 路由,即使用 resources :slides 创建时,Rails 才会为不同动词提供相同的前缀。例如:“GET、PATCH、PUT 和 DELETE”的 slide_path
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 2018-09-05
    • 2011-09-21
    • 1970-01-01
    相关资源
    最近更新 更多