Rails 3 在可选范围内路由资源

发布于 2024-11-05 18:17:43 字数 3473 浏览 0 评论 0原文

我有 设置我的版本化 API 像这样只需要一个为了向后兼容而进行的小调整。在我的路线中,我有:

scope '(api(/:version))', :module => :api, :version => /v\d+?/ do
    …
    scope '(categories/:category_id)', :category_id => /\d+/ do
        …
        resources :sounds
        …
    end
end

已经成功实现以下 URL 到达同一位置的目标

/api/v1/categories/1/sounds/2
/api/categories/1/sounds/2
/categories/1/sounds/2
/sounds/2

我的目录结构如下所示:

在此处输入图像描述

我看到的问题出在我的观点中的链接生成中。例如,在声音显示页面上,我有一个 button_to 来删除声音

<%= button_to 'Delete', @sound, :confirm => 'Are you sure?', :method => :delete %>

,它以 action 的形式生成以下网址:

"/api/sounds/1371?version=1371"

此外,delete code> 方法不起作用,而是作为 POST 发送。

rake 路由 的有趣部分是:

                     sounds GET    (/api(/:version))(/categories/:category_id)/sounds(.:format)                               {:controller=>"api/sounds", :version=>/v\d+?/, :action=>"index", :category_id=>/\d+/}
                            POST   (/api(/:version))(/categories/:category_id)/sounds(.:format)                               {:controller=>"api/sounds", :version=>/v\d+?/, :action=>"create", :category_id=>/\d+/}
                  new_sound GET    (/api(/:version))(/categories/:category_id)/sounds/new(.:format)                           {:controller=>"api/sounds", :version=>/v\d+?/, :action=>"new", :category_id=>/\d+/}
                 edit_sound GET    (/api(/:version))(/categories/:category_id)/sounds/:id/edit(.:format)                      {:controller=>"api/sounds", :version=>/v\d+?/, :action=>"edit", :category_id=>/\d+/}
                      sound GET    (/api(/:version))(/categories/:category_id)/sounds/:id(.:format)                           {:controller=>"api/sounds", :version=>/v\d+?/, :action=>"show", :category_id=>/\d+/}
                            PUT    (/api(/:version))(/categories/:category_id)/sounds/:id(.:format)                           {:controller=>"api/sounds", :version=>/v\d+?/, :action=>"update", :category_id=>/\d+/}
                            DELETE (/api(/:version))(/categories/:category_id)/sounds/:id(.:format)                           {:controller=>"api/sounds", :version=>/v\d+?/, :action=>"destroy", :category_id=>/\d+/}

服务器日志显示:

Started POST "/api/sounds/1371?version=1371" for 127.0.0.1 at Fri May 06 23:28:27 -0400 2011
  Processing by Api::SoundsController#show as HTML
  Parameters: {"authenticity_token"=>"W+QlCKjONG5i/buIgLqsrm3IHi5gdQVzFGYGREpmWYs=", "id"=>"1371", "version"=>371}

我正在使用 JQuery 作为我的 UJS并拥有最新版本的rails.js jQuery:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js" type="text/javascript"></script> <!-- must be >= 1.4.4 for the rails 3 link js to work—> 
<script src="/javascripts/jquery-ujs/src/rails.js?1304736923" type="text/javascript"></script>




我知道这是 tl;dr 但我的问题是:“我需要在 Button_to link_to 和其他视图标记中放入什么,才能使 url 帮助程序为我的设置生成正确的路径? ”我尝试了几乎所有我能想到的组合,但永远无法让它们到达正确的位置。

I have setup my versioned API like this with only a small tweak for backwards compatibility. In my routes I have:

scope '(api(/:version))', :module => :api, :version => /v\d+?/ do
    …
    scope '(categories/:category_id)', :category_id => /\d+/ do
        …
        resources :sounds
        …
    end
end

with the successful goal already reached of having the following URL's reach the same place

/api/v1/categories/1/sounds/2
/api/categories/1/sounds/2
/categories/1/sounds/2
/sounds/2

My directory structure is like this:

enter image description here

The problem I am seeing is in my link generations in my views. For example, on the sound show page I have a button_to to delete the sound

<%= button_to 'Delete', @sound, :confirm => 'Are you sure?', :method => :delete %>

Which generates the following url in the form action:

"/api/sounds/1371?version=1371"

And furthermore, the delete method is not working, instead it is being sent as a POST

The interesting parts of rake routes are:

                     sounds GET    (/api(/:version))(/categories/:category_id)/sounds(.:format)                               {:controller=>"api/sounds", :version=>/v\d+?/, :action=>"index", :category_id=>/\d+/}
                            POST   (/api(/:version))(/categories/:category_id)/sounds(.:format)                               {:controller=>"api/sounds", :version=>/v\d+?/, :action=>"create", :category_id=>/\d+/}
                  new_sound GET    (/api(/:version))(/categories/:category_id)/sounds/new(.:format)                           {:controller=>"api/sounds", :version=>/v\d+?/, :action=>"new", :category_id=>/\d+/}
                 edit_sound GET    (/api(/:version))(/categories/:category_id)/sounds/:id/edit(.:format)                      {:controller=>"api/sounds", :version=>/v\d+?/, :action=>"edit", :category_id=>/\d+/}
                      sound GET    (/api(/:version))(/categories/:category_id)/sounds/:id(.:format)                           {:controller=>"api/sounds", :version=>/v\d+?/, :action=>"show", :category_id=>/\d+/}
                            PUT    (/api(/:version))(/categories/:category_id)/sounds/:id(.:format)                           {:controller=>"api/sounds", :version=>/v\d+?/, :action=>"update", :category_id=>/\d+/}
                            DELETE (/api(/:version))(/categories/:category_id)/sounds/:id(.:format)                           {:controller=>"api/sounds", :version=>/v\d+?/, :action=>"destroy", :category_id=>/\d+/}

and the server logs show:

Started POST "/api/sounds/1371?version=1371" for 127.0.0.1 at Fri May 06 23:28:27 -0400 2011
  Processing by Api::SoundsController#show as HTML
  Parameters: {"authenticity_token"=>"W+QlCKjONG5i/buIgLqsrm3IHi5gdQVzFGYGREpmWYs=", "id"=>"1371", "version"=>371}

I am using JQuery as my UJS and have the most recent version of rails.js for JQuery:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js" type="text/javascript"></script> <!-- must be >= 1.4.4 for the rails 3 link js to work—> 
<script src="/javascripts/jquery-ujs/src/rails.js?1304736923" type="text/javascript"></script>

I know this is tl;dr but my question is: "What do I need to put in my button_to link_to and other view tags to make the url helpers generate the correct path for my setup?" I have tried just about every combination I can think of but can never get them to end up in the right place.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

久随 2024-11-12 18:17:43

事实证明,解决方案很简单。我在这里犯了两个错误,导致生成错误的路由和附加参数的 url。

  1. resources :sounds 路线上方,我错误地添加了这一行:

    匹配 '/sounds/:id(/:format)' => '声音#show'
    

    我有这一行,以便sounds/123/xml可以被页面缓存。这导致所有路由都到 show ,我意识到错误是我在括号中包含 :format ,并且匹配应该是 get 。现在它是:

    获取 '/sounds/:id/:format' => '声音#show'
    
  2. 接下来,在 button_to 链接中,我将 @sound 对象作为我的第二个参数。 Rails 试图智能地从中推断出正确的 url,但由于可选的 api :version 参数而失败。将其更改为

    sound_path(:id => @sound.id)
    

    工作起来就像一个魅力。

Turns out the solution was an easy one. I had two mistakes here that caused the wrong route to generate and the url to append params.

  1. above the resources :sounds route, I mistakenly had this line:

    match '/sounds/:id(/:format)' => 'sounds#show'
    

    I have this line so that sounds/123/xml can be page cached. This caused all the routing to show and I realized the mistake was that I had the :format in parens, and the match should be a get. Now it reads:

    get '/sounds/:id/:format' => 'sounds#show'
    
  2. Next, in the button_to link, I was placing the @sound object as my second param. Rails was trying to be intelligent an extrapolate the right url from this, but was failing with the optional api :version param. Changing it to

    sound_path(:id => @sound.id)
    

    worked like a charm.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文