Сообщение об ошибке при использовании 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 не нужно указывать явно).

Если вы хотите, чтобы пройти через это самостоятельно, вот ссылка

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