Путь соединения рельсов и ошибка маршрутизации, когда модели единственного и множественного числа совпадают (например, оборудование, виды)
<%= 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