Сообщение об ошибке при использовании Rails MailForm Gem - неопределенный метод 'contacts_path
Мы пытаемся использовать Rails MailForm Gem для создания контактной формы для каждого экземпляра кемпинга в нашем приложении, чтобы после заполнения формы пользователем электронное письмо отправлялось прямо из формы владельцу сайта лагеря.
Мы вложили ресурс для контактов в ресурс сайта в sites.rb - чтобы убедиться, что форма находится по пути - localhost:3000/sites/1/contacts/new, а не localhost:3000/contacts/new.
Есть ли что-то ключевое, чего нам не хватает в нашем приложении, или мы должны подойти к этой проблеме по-другому? Совет ценится.
Наш код для этого
resources :campsites do
resources :contacts
end
Однако мы получаем ошибку при попытке просмотра этого пути. Сообщенная ошибка заявляет undefined method "contacts_path' for #<#<Class:0x007ff0ed9527d0>:0x007ff0ed950de0>
и мы не уверены, почему.
Мы следили за этим пошаговым описанием ( https://rubyonrailshelp.wordpress.com/2014/01/08/rails-4-simple-form-and-mail-form-to-make-contact-form/).
Мы просмотрели документацию по gem и Rails, но по-прежнему не можем просматривать форму после нескольких попыток, и мы не уверены, связано ли это с тем, где мы пытаемся просмотреть форму в приложении.
При запуске localhost: 3000 / sites / 1 / contacts / new мы получаем следующую ошибку:
NoMethodError in Contacts#new
Showing /Users/elinnet/makers/week11/campFri/app/views/contacts/new.html.erb where line #4 raised:
undefined method 'contacts_path' for #<#<Class:0x007ff0ed9527d0>:0x007ff0ed950de0>
Extracted source (around line #4):
(1) <h3>Send A message to Us</h3>
(2) <%= simple_form_for @contact, :html => {:class => 'form-horizontal' } do |f| %>
(3) <%= f.input :name, :required => true %>
(4) <%= f.input :email, :required => true %>
(5) <%= f.input :message, :as => :text, :required => true %>
Контроллер для контактов это:
class ContactsController < ApplicationController
def new
@contact = Contact.new
end
def create
@contact = Contact.new(params[:contact])
@contact.request = request
if @contact.deliver
flash.now[:notice] = 'Thank you for your message. We will contact you soon!'
else
flash.now[:error] = 'Cannot send message.'
render :new
end
end
end
Модель для контактов:
class Contact < MailForm::Base
attribute :name, :validate => true
attribute :email, :validate => /\A([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})\z/i
attribute :message
attribute :nickname, :captcha => true
def headers
{
:subject => "My Contact Form",
:to => "your_email@example.org",
:from => %("#{name}" <#{email}>)
}
end
end
Ссылка на проект Github: https://github.com/elinnet/camping.git
2 ответа
Вы маршруты
resources :campsites do
resources :contacts
end
Итак, вы должны передать в форму два параметра в массиве следующим образом:
<%= simple_form_for [@campsite, @contact], :html => {:class => 'form-horizontal' } do |f| %>
И ваше новое действие в контроллере должно выглядеть примерно так:
def new
@campsite = Campsite.find(params[:campsite_id]
@contact = @campsite.contacts.build
end
Вам нужно будет пройти в url
в simple_form_for
метод.
<%= simple_form_for @contact, url: correct_url_here :html => {:class => 'form-horizontal' } do |f| %>
бежать rake routes
найти правильный URL:
Вот выдержка из URL.
: url - URL, на который должна быть отправлена форма. Это может быть представлено так же, как значения, передаваемые в url_for или link_to. Так, например, вы можете использовать именованный маршрут напрямую. Когда модель представлена строкой или символом, как в примере выше, если опция: url не указана, по умолчанию форма будет отправлена обратно на текущий URL-адрес (ниже мы опишем альтернативное ориентированное на ресурсы использование form_for, в котором URL не нужно указывать явно).
Если вы хотите, чтобы пройти через это самостоятельно, вот ссылка