Ошибка при сопоставлении маршрута с пользовательскими параметрами в Rails 3, который работал в Rails 2.3 - PullRequest
2 голосов
/ 27 января 2012

Мы конвертируем наше приложение Rails 2.3 в 3.0.11, и у нас возникла проблема с переносом некоторых маршрутов.

Мне кажется, что наши пользовательские параметры (: title и: name_recognition) вызываютнекоторые проблемы.Тем не менее, мы используем именованные маршруты, поэтому мне очень непонятно, почему Rails вообще пытается выполнить какое-либо сопоставление по контроллеру, действию и параметрам.

Ошибка, которую мы получаем:

ActionView::Template::Error (No route matches {:controller=>"audience_tool", :action=>"show", :name_recognition=>"BandName", :title=>"", :id=>1388}):

Это рассматриваемый маршрут от routs.rb:

match ':name_recognition/:title/:id' => 'audience_tool#show', :as => :show_page

Вот результат "rake route":

show_page  /:name_recognition/:title/:id  {controller=>"audience_tool", :action=>"show"}

Вот метод модели, который мы используем для построения URL:

def url(options=Hash.new)
  options.reverse_merge!({
    :name_recognition => name_recognition,
    :title => title,
    :id => id
  })
  show_page_path options
end

Вот как мы называем метод:

link_to("The Link text", show.url)

Stack Trace, за исключением кода шаблона, который отображается в ошибке:

actionpack (3.0.11) lib/action_dispatch/routing/route_set.rb:425:in `raise_routing_error'
actionpack (3.0.11) lib/action_dispatch/routing/route_set.rb:398:in `generate'
actionpack (3.0.11) lib/action_dispatch/routing/route_set.rb:454:in `generate'
actionpack (3.0.11) lib/action_dispatch/routing/route_set.rb:482:in `url_for'
actionpack (3.0.11) lib/action_dispatch/routing/url_for.rb:131:in `url_for'
actionpack (3.0.11) lib/action_dispatch/routing/route_set.rb:195:in `show_page_path'
app/models/performance.rb:245:in `url'
app/views/performances/_show_banner.haml:12:in `block in _app_views_performances__show_banner_haml___933466686__622884308__332894942'
haml (3.1.4) lib/haml/helpers/action_view_mods.rb:93:in `block in capture_with_haml'
haml (3.1.4) lib/haml/helpers.rb:345:in `call'
haml (3.1.4) lib/haml/helpers.rb:345:in `block in capture_haml'
haml (3.1.4) lib/haml/helpers.rb:569:in `with_haml_buffer'
haml (3.1.4) lib/haml/helpers.rb:341:in `capture_haml'
haml (3.1.4) lib/haml/helpers/xss_mods.rb:61:in `capture_haml_with_haml_xss'
haml (3.1.4) lib/haml/helpers/action_view_mods.rb:93:in `capture_with_haml'
app/helpers/pretty_helper.rb:4:in `rounded_wrap'
app/views/performances/_show_banner.haml:4:in `_app_views_performances__show_banner_haml___933466686__622884308__332894942'

1 Ответ

4 голосов
/ 31 января 2012

пустой атрибут title внутри параметра является проблемой

маршруты динамических параметров, объявленные как -

 match ':a/:b/:c', :to => 'home#index', :as => :q

, теперь идут на консоль rails -

ruby-1.9.3-head :005 > app.q_url(:a, :b, :c)
 => "http://www.example.com/a/b/c" 

ruby-1.9.3-head :006 > app.q_url(:a, :b, '')
ActionController::RoutingError: No route matches {:controller=>"home", :a=>:a, :b=>:b, :c=>""}

над маршрутоможидает, что каждый параметр внутри URL будет присутствовать.Если вы слишком уверены, что определенный параметр может быть пустым, вы можете определить его как дополнительный параметр внутри маршрута -

match ':a/:b(/:c)', :to => 'home#index', :as => :q

ruby-1.9.3-head :010 > app.q_url(:a, :b, '')
 => "http://www.example.com/a/b?c=" 
ruby-1.9.3-head :011 > app.q_url(:a, :b)
 => "http://www.example.com/a/b"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...