Путь соединения рельсов и ошибка маршрутизации, когда модели единственного и множественного числа совпадают (например, оборудование, виды)

<%= link_to t('.new', :default => t("helpers.links.new")), new_equipment_path, :class => 'btn btn-primary' %>

У меня есть приведенный выше код в представлении, но я получаю следующую ошибку при нажатии на ссылку: No route matches {:action=>"show", :controller=>"equipment"}

Мой маршрутный файл содержит:

resources :equipment

resources :workouts

match ':controller(/:action(/:id))(.:format)'

Почему он пытается получить доступ к действию шоу?

Вот записи из моих маршрутов:

   equipment_index GET        /equipment(.:format)                   equipment#index
                   POST       /equipment(.:format)                   equipment#create
     new_equipment GET        /equipment/new(.:format)               equipment#new
    edit_equipment GET        /equipment/:id/edit(.:format)          equipment#edit
         equipment GET        /equipment/:id(.:format)               equipment#show
                   PUT        /equipment/:id(.:format)               equipment#update
                   DELETE     /equipment/:id(.:format)               equipment#destroy

3 ответа

Решение

Эта проблема возникла ранее и связана с тем, как rails scaffolding генерирует файл new.html.erb для моделей с такими именами, как "equipment", которые имеют как единственное, так и множественное число.

Если вы осмотрите form_for в файле new.html.erb вы увидите equipment_path в ссылке внизу. Для этих моделей с единичными == множественными именами, которые относятся к маршруту, который на самом деле для show действие, следовательно, ваше сообщение об ошибке.

Часто совет заключается в том, чтобы "избегать названий моделей, как это возможно, если это возможно", или в нем нужно немного возиться с файлом config / initializers / inflections.rb для принудительного использования множественной версии названия модели. Конечно, в результате вы получите приложение с очень странными ссылками на модели: с "оборудованием" работать не очень приятно (а кто-то позже "исправит" его, снова запутавшись).

Чтобы грамматически правильное название модели было необходимо, вам нужно исправить форму form_for, т.е.

<% form_for(@equipment, :url=> {:action=>'create'}) do |f| %>

и ссылка:

<%= link_to 'Back', equipment_index_path %>

Вы пытались добавить 's' к equiment в ваших маршрутах.rb?

resources :equipments

Поскольку оборудование считается неисчисляемым существительным, вы должны быть в состоянии решить это, используя склонения.

В документации рельсов на перегибах фактически используется оборудование как часть его примера.

Добавьте следующее к вашему config/initializers/inflections.rb,

ActiveSupport::Inflector.inflections do |inflect|
  inflect.uncountable 'equipment'
end

Дополнительная информация: Неисчисляемые существительные в Rails 3 Resource Routing

Другие вопросы по тегам