Ruby on Rails: невозможно переместить URL-адрес контактной формы без получения NoMethodError

Я новичок в рельсах, и у меня возникли проблемы с перемещением контактной формы из «/contacts» в «/contact». Просто, я знаю!

Я следовал следующему руководству, и все заработало: контактная форма/" rel="nofollow noreferrer">https://rubyonrailshelp.wordpress.com/2014/01/08/rails-4-simple-form-and-mail-form-to-make-contact-form/

Однако я не могу сделать что-то столь же простое, как изменить URL-адрес, не получая ошибки. По мере того, как я учусь, это похоже на то, что я должен уметь делать... Я внес следующие изменения:

1) Изменены route.rb:

match '/contacts', to: 'contacts#new', via: 'get'
resources "contacts", only: [:new, :create]

Стал

match '/contact', to: 'contact#new', via: 'get'
resources "contact", only: [:new, :create]

2) Переименовано "app/controllers/contacts_controller.rb" в "app/controllers/contact_controller.rb"

3) Обновлена ​​и изменена первая строка «contact_controller.rb»:

class ContactsController < ApplicationController 

Стал

class ContactController < ApplicationController

4) Представления перемещены из "приложение/представления/контакты/" в "приложение/представления/контакт/"

Я получаю следующую ошибку:

NoMethodError in Contact#new
undefined method `contacts_path' for #<#<Class:0xa0e4500>:0xa0efb28>
Did you mean?  contact_path

Думая, что где-то есть «контакты_путь», я провел поиск по всему проекту, и никаких «контактов» не существует.

Любая помощь будет принята с благодарностью! Благодарю вас!

Руби 2.3.3 Рельсы 5.0.1


person S4NK    schedule 08.04.2017    source источник
comment
Вы перезапустили сервер?   -  person radubogdan    schedule 09.04.2017
comment
@radubogdan Да. Я пробовал это несколько раз. Строка, которую он выделяет, такова: <%= simple_form_for @contact, :html => {:class => 'form-horizontal' } do |f| %>   -  person S4NK    schedule 09.04.2017


Ответы (1)


Проблема в том, что путь по умолчанию для form_for @object, когда объект не сохраняется (новая запись), всегда objects_path. Вам нужно будет явно указать URL-адрес, что-то вроде...

<%= simple_form_for @contact, as: :contact, url: '/contact', html: { class: "new_contact", id: "new_contact" } do |f| %>

НО это испортит форму для ваших существующих контактов, когда вы попытаетесь их отредактировать.

Вам нужно будет выполнить <% if @contact.new_record? %>, <% else %> и <% end %>, чтобы обработать два разных требуемых URL-адреса.

Так что лучшая рекомендация — действительно следовать соглашению! Используйте множественное число для контроллера, верните маршрут в прежнее состояние.

Если у вас нет веских причин нарушать правило «соглашение важнее конфигурации», вы не должны этого делать.

Документы объясняют используемые по умолчанию URL-адреса. https://apidock.com/rails/ActionView/Helpers/FormHelper/form_for

person SteveTurczyn    schedule 08.04.2017
comment
Это помогло! И спасибо за информацию о form_for @object и о соглашении по настройке. Это все новое, поэтому я очень ценю это! Я проголосовал за ответ ... Просто пока не хватает репутации. :) - person S4NK; 09.04.2017
comment
Рад, что смог помочь! Хотя вы, возможно, еще не сможете проголосовать за ответ, у вас должна быть возможность принять ответ... этот вариант находится сразу слева от моего ответа. Было бы здорово, если бы вы могли это сделать. - person SteveTurczyn; 09.04.2017
comment
Готово! Благодарю вас! - person S4NK; 14.04.2017