Rails 3 在可选范围内路由资源
我有 设置我的版本化 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:
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
事实证明,解决方案很简单。我在这里犯了两个错误,导致生成错误的路由和附加参数的 url。
在
resources :sounds
路线上方,我错误地添加了这一行:我有这一行,以便
sounds/123/xml
可以被页面缓存。这导致所有路由都到show
,我意识到错误是我在括号中包含:format
,并且匹配应该是get
。现在它是:接下来,在
button_to
链接中,我将@sound
对象作为我的第二个参数。 Rails 试图智能地从中推断出正确的 url,但由于可选的 api:version
参数而失败。将其更改为工作起来就像一个魅力。
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.
above the
resources :sounds
route, I mistakenly had this line:I have this line so that
sounds/123/xml
can be page cached. This caused all the routing toshow
and I realized the mistake was that I had the:format
in parens, and the match should be aget
. Now it reads: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 toworked like a charm.