2011-04-11 111 views
4

我正在製作一個類似於Flickr的圖像服務器。在我的路線文件我有:Rails 3路由問題

get "/image/server/:secret_:id(_:size).:format", :to => "api/images#server", :as => :api_image 

然後在我看來,我打電話以下,但總是收到的ActionController :: RoutingError例外:

api_image_path({ :secret=>"07fde2a9c76de3d16fb70e772d944652", :id=>2, :size=>"t", :format=>"png" }) 

錯誤:

No route matches {:controller=>"api/images", :action=>"server", :secret=>"07fde2a9c76de3d16fb70e772d944652", :id=>2, :size=>"t", :format=>"png"} 

更新

請求參數外觀如下所示。它似乎沒有檢測到祕密和身份證之間的下劃線。它將這一切合併爲祕密。例如,如果我要求:http://example.com/image/server/07fde2a9c76de3d16fb70e772d944652_2_n.jpg我會得到我的PARAMS如下:

{"secret_"=>"07fde2a9c76de3d16fb70e772d944652_2_", 
"id"=>"n", 
"format"=>"jpg"} 

它取整串一直到_n之前將其賦值給祕密,由於某種原因它secret_調用它。

的ActionController :: RoutingError(完整曲線)

actionpack (3.0.3) lib/action_dispatch/routing/route_set.rb:424:in `raise_routing_error' 
actionpack (3.0.3) lib/action_dispatch/routing/route_set.rb:397:in `generate' 
actionpack (3.0.3) lib/action_dispatch/routing/route_set.rb:453:in `generate' 
actionpack (3.0.3) lib/action_dispatch/routing/route_set.rb:481:in `url_for' 
actionpack (3.0.3) lib/action_dispatch/routing/url_for.rb:131:in `url_for' 
actionpack (3.0.3) lib/action_view/helpers/url_helper.rb:99:in `url_for' 
actionpack (3.0.3) lib/action_dispatch/routing/route_set.rb:195:in `api_image_url' 
app/views/services/about.html.erb:8:in `_app_views_services_about_html_erb__1824827504506770107_2158066880_1802331327662141069' 
actionpack (3.0.3) lib/action_view/template.rb:135:in `block in render' 
activesupport (3.0.3) lib/active_support/notifications.rb:54:in `instrument' 
actionpack (3.0.3) lib/action_view/template.rb:127:in `render' 
actionpack (3.0.3) lib/action_view/render/rendering.rb:59:in `block in _render_template' 
activesupport (3.0.3) lib/active_support/notifications.rb:52:in `block in instrument' 
activesupport (3.0.3) lib/active_support/notifications/instrumenter.rb:21:in `instrument' 
activesupport (3.0.3) lib/active_support/notifications.rb:52:in `instrument' 
actionpack (3.0.3) lib/action_view/render/rendering.rb:56:in `_render_template' 
actionpack (3.0.3) lib/action_view/render/rendering.rb:26:in `render' 
actionpack (3.0.3) lib/abstract_controller/rendering.rb:114:in `_render_template' 
actionpack (3.0.3) lib/abstract_controller/rendering.rb:108:in `render_to_body' 
actionpack (3.0.3) lib/action_controller/metal/renderers.rb:47:in `render_to_body' 
actionpack (3.0.3) lib/action_controller/metal/compatibility.rb:55:in `render_to_body' 
actionpack (3.0.3) lib/abstract_controller/rendering.rb:101:in `render_to_string' 
actionpack (3.0.3) lib/abstract_controller/rendering.rb:92:in `render' 
actionpack (3.0.3) lib/action_controller/metal/rendering.rb:17:in `render' 
actionpack (3.0.3) lib/action_controller/metal/instrumentation.rb:40:in `block (2 levels) in render' 
activesupport (3.0.3) lib/active_support/core_ext/benchmark.rb:5:in `block in ms' 
/usr/local/Cellar/ruby/1.9.2-p0/lib/ruby/1.9.1/benchmark.rb:309:in `realtime' 
activesupport (3.0.3) lib/active_support/core_ext/benchmark.rb:5:in `ms' 
actionpack (3.0.3) lib/action_controller/metal/instrumentation.rb:40:in `block in render' 
actionpack (3.0.3) lib/action_controller/metal/instrumentation.rb:78:in `cleanup_view_runtime' 
activerecord (3.0.3) lib/active_record/railties/controller_runtime.rb:15:in `cleanup_view_runtime' 
thinking-sphinx (2.0.3) lib/thinking_sphinx/action_controller.rb:12:in `cleanup_view_runtime' 
actionpack (3.0.3) lib/action_controller/metal/instrumentation.rb:39:in `render' 
actionpack (3.0.3) lib/action_controller/metal/implicit_render.rb:10:in `default_render' 
actionpack (3.0.3) lib/action_controller/metal/implicit_render.rb:4:in `send_action' 
actionpack (3.0.3) lib/abstract_controller/base.rb:151:in `process_action' 
actionpack (3.0.3) lib/action_controller/metal/rendering.rb:11:in `process_action' 
actionpack (3.0.3) lib/abstract_controller/callbacks.rb:18:in `block in process_action' 
activesupport (3.0.3) lib/active_support/callbacks.rb:456:in `block in _run__3222905760235059467__process_action__3328463717343760166__callbacks' 
activesupport (3.0.3) lib/active_support/callbacks.rb:220:in `block in _conditional_callback_around_188' 
activesupport (3.0.3) lib/active_support/callbacks.rb:330:in `around' 
activesupport (3.0.3) lib/active_support/callbacks.rb:314:in `_callback_around_35' 
activesupport (3.0.3) lib/active_support/callbacks.rb:219:in `_conditional_callback_around_188' 
activesupport (3.0.3) lib/active_support/callbacks.rb:435:in `_run__3222905760235059467__process_action__3328463717343760166__callbacks' 
activesupport (3.0.3) lib/active_support/callbacks.rb:409:in `_run_process_action_callbacks' 
activesupport (3.0.3) lib/active_support/callbacks.rb:93:in `run_callbacks' 
actionpack (3.0.3) lib/abstract_controller/callbacks.rb:17:in `process_action' 
actionpack (3.0.3) lib/action_controller/metal/instrumentation.rb:30:in `block in process_action' 
activesupport (3.0.3) lib/active_support/notifications.rb:52:in `block in instrument' 
activesupport (3.0.3) lib/active_support/notifications/instrumenter.rb:21:in `instrument' 
activesupport (3.0.3) lib/active_support/notifications.rb:52:in `instrument' 
actionpack (3.0.3) lib/action_controller/metal/instrumentation.rb:29:in `process_action' 
actionpack (3.0.3) lib/action_controller/metal/rescue.rb:17:in `process_action' 
actionpack (3.0.3) lib/abstract_controller/base.rb:120:in `process' 
actionpack (3.0.3) lib/abstract_controller/rendering.rb:40:in `process' 
actionpack (3.0.3) lib/action_controller/metal.rb:138:in `dispatch' 
actionpack (3.0.3) lib/action_controller/metal/rack_delegation.rb:14:in `dispatch' 
actionpack (3.0.3) lib/action_controller/metal.rb:178:in `block in action' 
actionpack (3.0.3) lib/action_dispatch/routing/route_set.rb:62:in `call' 
actionpack (3.0.3) lib/action_dispatch/routing/route_set.rb:62:in `dispatch' 
actionpack (3.0.3) lib/action_dispatch/routing/route_set.rb:27:in `call' 
rack-mount (0.6.14) lib/rack/mount/route_set.rb:148:in `block in call' 
rack-mount (0.6.14) lib/rack/mount/code_generation.rb:93:in `block in recognize' 
rack-mount (0.6.14) lib/rack/mount/code_generation.rb:75:in `optimized_each' 
rack-mount (0.6.14) lib/rack/mount/code_generation.rb:92:in `recognize' 
rack-mount (0.6.14) lib/rack/mount/route_set.rb:139:in `call' 
actionpack (3.0.3) lib/action_dispatch/routing/route_set.rb:492:in `call' 
oa-core (0.2.1) lib/omniauth/strategy.rb:55:in `call!' 
oa-core (0.2.1) lib/omniauth/strategy.rb:22:in `call' 
oa-core (0.2.1) lib/omniauth/strategy.rb:55:in `call!' 
oa-core (0.2.1) lib/omniauth/strategy.rb:22:in `call' 
oa-core (0.2.1) lib/omniauth/strategy.rb:55:in `call!' 
oa-core (0.2.1) lib/omniauth/strategy.rb:22:in `call' 
oa-core (0.2.1) lib/omniauth/builder.rb:30:in `call' 
lib/flash_session_cookie_middleware.rb:20:in `call' 
warden (1.0.3) lib/warden/manager.rb:35:in `block in call' 
warden (1.0.3) lib/warden/manager.rb:34:in `catch' 
warden (1.0.3) lib/warden/manager.rb:34:in `call' 
actionpack (3.0.3) lib/action_dispatch/middleware/best_standards_support.rb:17:in `call' 
actionpack (3.0.3) lib/action_dispatch/middleware/head.rb:14:in `call' 
rack (1.2.2) lib/rack/methodoverride.rb:24:in `call' 
actionpack (3.0.3) lib/action_dispatch/middleware/params_parser.rb:21:in `call' 
actionpack (3.0.3) lib/action_dispatch/middleware/flash.rb:182:in `call' 
actionpack (3.0.3) lib/action_dispatch/middleware/session/abstract_store.rb:149:in `call' 
lib/flash_session_cookie_middleware.rb:20:in `call' 
actionpack (3.0.3) lib/action_dispatch/middleware/cookies.rb:295:in `call' 
activerecord (3.0.3) lib/active_record/query_cache.rb:32:in `block in call' 
activerecord (3.0.3) lib/active_record/connection_adapters/abstract/query_cache.rb:28:in `cache' 
activerecord (3.0.3) lib/active_record/query_cache.rb:12:in `cache' 
activerecord (3.0.3) lib/active_record/query_cache.rb:31:in `call' 
activerecord (3.0.3) lib/active_record/connection_adapters/abstract/connection_pool.rb:353:in `call' 
actionpack (3.0.3) lib/action_dispatch/middleware/callbacks.rb:46:in `block in call' 
activesupport (3.0.3) lib/active_support/callbacks.rb:415:in `_run_call_callbacks' 
actionpack (3.0.3) lib/action_dispatch/middleware/callbacks.rb:44:in `call' 
rack (1.2.2) lib/rack/sendfile.rb:107:in `call' 
actionpack (3.0.3) lib/action_dispatch/middleware/remote_ip.rb:48:in `call' 
actionpack (3.0.3) lib/action_dispatch/middleware/show_exceptions.rb:46:in `call' 
railties (3.0.3) lib/rails/rack/logger.rb:13:in `call' 
rack (1.2.2) lib/rack/runtime.rb:17:in `call' 
activesupport (3.0.3) lib/active_support/cache/strategy/local_cache.rb:72:in `call' 
rack (1.2.2) lib/rack/lock.rb:11:in `block in call' 
<internal:prelude>:10:in `synchronize' 
rack (1.2.2) lib/rack/lock.rb:11:in `call' 
actionpack (3.0.3) lib/action_dispatch/middleware/static.rb:30:in `call' 
railties (3.0.3) lib/rails/application.rb:168:in `call' 
railties (3.0.3) lib/rails/application.rb:77:in `method_missing' 
passenger (3.0.2) lib/phusion_passenger/rack/request_handler.rb:96:in `process_request' 
passenger (3.0.2) lib/phusion_passenger/abstract_request_handler.rb:513:in `accept_and_process_next_request' 
passenger (3.0.2) lib/phusion_passenger/abstract_request_handler.rb:274:in `main_loop' 
passenger (3.0.2) lib/phusion_passenger/rack/application_spawner.rb:205:in `start_request_handler' 
passenger (3.0.2) lib/phusion_passenger/rack/application_spawner.rb:170:in `block in handle_spawn_application' 
passenger (3.0.2) lib/phusion_passenger/utils.rb:479:in `safe_fork' 
passenger (3.0.2) lib/phusion_passenger/rack/application_spawner.rb:165:in `handle_spawn_application' 
passenger (3.0.2) lib/phusion_passenger/abstract_server.rb:357:in `server_main_loop' 
passenger (3.0.2) lib/phusion_passenger/abstract_server.rb:206:in `start_synchronously' 
passenger (3.0.2) lib/phusion_passenger/abstract_server.rb:180:in `start' 
passenger (3.0.2) lib/phusion_passenger/rack/application_spawner.rb:128:in `start' 
passenger (3.0.2) lib/phusion_passenger/spawn_manager.rb:253:in `block (2 levels) in spawn_rack_application' 
passenger (3.0.2) lib/phusion_passenger/abstract_server_collection.rb:132:in `lookup_or_add' 
passenger (3.0.2) lib/phusion_passenger/spawn_manager.rb:246:in `block in spawn_rack_application' 
passenger (3.0.2) lib/phusion_passenger/abstract_server_collection.rb:82:in `block in synchronize' 
<internal:prelude>:10:in `synchronize' 
passenger (3.0.2) lib/phusion_passenger/abstract_server_collection.rb:79:in `synchronize' 
passenger (3.0.2) lib/phusion_passenger/spawn_manager.rb:244:in `spawn_rack_application' 
passenger (3.0.2) lib/phusion_passenger/spawn_manager.rb:137:in `spawn_application' 
passenger (3.0.2) lib/phusion_passenger/spawn_manager.rb:275:in `handle_spawn_application' 
passenger (3.0.2) lib/phusion_passenger/abstract_server.rb:357:in `server_main_loop' 
passenger (3.0.2) lib/phusion_passenger/abstract_server.rb:206:in `start_synchronously' 
passenger (3.0.2) helper-scripts/passenger-spawn-server:99:in `<main>' 
+0

@Kyle嗨,你可以請張貼錯誤日誌:d – sameera207 2011-04-11 04:35:11

+1

也許api_image_path是錯誤的方法運行rake:路線,它會顯示路線名稱 – eggie5 2011-04-11 04:44:26

+0

@ eggie5我跑了它,它顯示爲ap i_image。 – 2011-04-11 04:49:01

回答

2

,路由分析器只支持正斜槓,網點和問題標記爲分隔符在它的缺省集合,所以也沒有看到「_」作爲的問題它有效的分隔符,並且當你匹配時,除了一個字符:id之外,你的所有匹配都會被取消。此外,您的參數是secret_,因爲路由器不會將_識別爲分隔符並將其包含在您的分段名稱中。

我覺得你的選擇是要麼從_移動到正斜槓(這將至少暫時確認問題是否真實或編寫自定義約束,如第3.8和這裏的路徑引導的3.10描述:http://guides.rubyonrails.org/routing.html#advanced-constraints

你可以閱讀更多的路徑一致這裏:http://apidock.com/rails/ActionController/Routing 這裏 https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/routing/mapper.rb

+0

感謝您的簡潔回答。我決定只是使用正斜槓來代替。 – 2011-04-14 16:10:15

0

下劃線是一個URL參數的有效字符。我希望這將解決您的問題

get "/image/server/:secret_:id(_:size).:format", :to => "api/images#server", :as => :api_image, :contraints => {:secret => /[\w\d]+/, :id => /[\d]+/, :size => /\w/} 
+0

更接近,但它仍然在** secret **的名稱和值的末尾添加下劃線。所以我的參數仍然看起來像「祕密\」:「07fde2a9c76de3d16fb70e772d944652 _」_ – 2011-04-11 16:42:04

+0

嗯。我懂了。 '\ w'也帶下劃線。使用':secret =>/[a-zA-Z0-9] + /' – Yeameen 2011-04-13 09:51:08

+0

同樣,下劃線是標識符的有效字母。那就是爲什麼rails會考慮':secret_'是變量的名稱,而不僅僅是':secret'。你可以使用短劃線'-'而不是下劃線。那麼,應該有一種方法可以將變量與其他有效字符分開,儘管 – Yeameen 2011-04-13 13:45:20