Изменяет ли Rails 3.x поведение link_to, когда целью ссылки является объект ActiveRecord? - PullRequest
0 голосов
/ 21 ноября 2011

Я обновляю свое приложение Ruby on Rails с Rails 2.3.11 до 3.1.1.После обновления моего файла маршрутов новым синтаксисом я вижу изменение в поведении метода link_to при передаче объекта ActiveRecord в качестве места назначения ссылки.

Вот пример старого (неRESTful) route от моего 2.3-файла route.rb приложения:

map.with_options :controller => 'widget' do |widget|
    widget.widget 'widget/show/:id', :action => 'show'
end

Вот как этот маршрут стал в моем файле 3.1:

scope "widget", :controller => :widget do
    match "show/:id", :action => "show", :as => :widget
  end
end

Вывод rake routes аналогичен.2.3:

widget /widget/show(/:id) {:controller=>"widget", :action=>"show"}

3.1:

widget /widget/show/:id(.:format) {:action=>"show", :controller=>"widget"}

Разница в том, что теперь мои вызовы link_to выглядят так:

link_to("Text", @widget_object)

Создать это сообщение об ошибке:

Routing Error: No route matches { :controller=>"widget", :action=>"show", :id=>#<Widget id: 123, .....> }

После просмотра этого отрывка в Направляющие рельсов :

<% = link_to "Сведения о журнале", @magazine%> ... Это позволяет вам рассматривать экземпляры ваших моделей как URL-адреса и является ключевым преимуществом использования изобретательного стиля. "

я предполагаю, что Rails 2.3 успешно обработал мои link_to s, потому что мой маршрут назывался "widget" (изменение имени привело бы к разрыву link_to s моего приложения 2.3), но Rails 3 настаивает наRESTful / ресурсные маршруты, если вы собираетесь использовать этот стиль link_to.

Это верно? Я начал рефакторинг и добавляю необходимые маршруты RESTful, чтобы мои link_to снова работали - с хорошимрезультаты - но я хочу подтвердить, что я действительно понимаю проблему. Я открыл ветку на rubyonrails-talk list , но еще не получил ответов.

1 Ответ

1 голос
/ 21 ноября 2011

Поскольку вы не используете обычную настройку для ресурса Widget, которая будет:

resources :widgets

Rails не знает, где должен указываться URL для @magazine.Вы должны быть явными:

link_to "Text", widget_path(@widget_object)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...