Mail_form: нет совпадений маршрута [POST] — ошибка маршрутизации

Рейлс 3.2

Я использую гем Mail_form (от plataformatec), чтобы создать простую форму «свяжитесь с нами» для своего веб-сайта. Когда я нажимаю «отправить», я получаю сообщение об ошибке маршрутизации:

Routing Error
No route matches [POST] "/contactus"
Try running rake routes for more information on available routes.

У меня очень простая установка, но я новичок в Rails и все еще осваиваю ее. Я только хочу, чтобы форма отправляла электронное письмо на определенный адрес электронной почты... больше ничего. Я понимаю, что проблема в route.rb, но я так долго возился с этим, что просто не могу понять, что не так. Я никогда так сильно не боролся с ошибкой Rails. ПОЖАЛУЙСТА ПОМОГИ!

Модель «Страницы»: app/models/pages.rb

class Page < MailForm::Base
  attribute :name,          :validate => true
  attribute :email,         :validate => /\A([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})\z/i
  attribute :page_title,    :validate => true
  attribute :page_body,     :validate => true

  def headers
    :subject => "#{page_title}",
    :to => "[email protected]",
    :from => %("#{name}" <#{email}>)
  end
end

Контроллер «Страницы»: app/controllers/pages_controller.rb

class PagesController < ApplicationController
    respond_to :html

    def index
    end

    def create
        page = Page.new(params[:contact_form])
        if page.deliver
          redirect_to contactus_path, :notice => 'Email has been sent.'
        else
          redirect_to contactus_path, :notice => 'Email could not be sent.'
        end
    end
end

Частичная форма: app/views/pages/_form.html.erb

<%= simple_form_for :contact_form, url: contactus_path, method: :post do |f| %>

<div>
    <%= f.input :name %>
    <%= f.input :email, label: 'Email address' %>
    <%= f.input :page_title, label: 'Title' %>
    <%= f.input :page_body, label: 'Your message', as: :text %>
</div>

<div class="form-actions">
    <%= f.button :submit, label: 'Send', as: :text %>
</div>

Представление (называемое contactus): app/views/pages/contactus.html.erb

<body>
    <div>
        <h2 class="centeralign text-info">Contact Us</h2>
    </div>
    <div class="container centeralign">
            <%= render 'form' %>
    </div>
            <h2>We'd love to hear from you! </h2><br /><h4 class="muted">Send us a message and we'll get back to you as soon as possible</h4>
    </div>
</div>
</body>

Routes.rb

Example::Application.routes.draw do
  resources :pages
  root to: 'pages#index', as: :home
  get 'contactus', to: 'pages#contactus', as: :contactus
  get 'services', to: 'pages#services', as: :services

person averroes    schedule 01.08.2013    source источник
comment
Когда вы нажимаете кнопку «Отправить», это обрабатывается как почтовый запрос, для которого у вас нет маршрута, определенного в route.rb.   -  person Hassan Javeed    schedule 01.08.2013


Ответы (1)


В вашем файле route.rb нет маршрута для POST /contactus У вас есть маршрут для GET /contactus, но нет POST, так что рельсы говорят правильно.

Просто добавьте что-то вроде

post 'contactus', to: 'controller#action'

С любым контроллером и действием, которое вам нужно вызвать. В качестве альтернативы, если вы пытаетесь вызвать действие create в контроллере страниц, ваша проблема заключается в том, что когда вы добавили resources :pages к маршрутам, вы фактически создали маршрут

post 'pages'

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

simple_form_for :contact_form, url: pages_path, method: :post do

вместо. Если pages_path не работает, просто запустите rake routes в консоли, и вы увидите список всех имеющихся у вас маршрутов, включая их имена. Тогда просто выберите тот, который вам нужен для этого :)

person PaReeOhNos    schedule 01.08.2013
comment
Ух ты ответил буквально за минуту. Спасибо! Я получаю сообщение об ошибке «неинициализированная константа» в pagescontroller#create. Любые идеи о том, почему? Я создал класс "Страница" в моей модели Page.rb... - person averroes; 01.08.2013
comment
Ах, хорошо, это до рельсовой конвенции. В route.rb вам также не нужно использовать слово controller. Так что измените это на pages#create, и все должно быть в порядке :) - person PaReeOhNos; 01.08.2013
comment
Теперь это имеет для меня смысл! Но все равно пишет, что у меня ошибка именования в pagescontroller#create.... - person averroes; 01.08.2013
comment
Даже если вы измените это на pages#create вместо pagescontroller#create? - person PaReeOhNos; 01.08.2013
comment
Да ... ошибка говорит мне, что это метод «создания» контроллера страниц. Но это странно, так как я добавил сообщение «контакты» в: «страницы # создать» в route.rb - person averroes; 01.08.2013
comment
Я не знаю, помогает ли это, но он говорит, что ошибка находится в строке 8 моего контроллера страниц. Я полагаю, что это связано со строкой page= Page.new? - person averroes; 01.08.2013
comment
Оххх ладно извините. Итак, здесь снова проблема с соглашением об именах рельсов. По сути, с рельсами вам никогда не нужно называть вещи так, чтобы они описывали, что они из себя представляют. Итак, в вашем случае вы назвали файл page_model.rb. Rails это не нравится, поэтому переименуйте его в page.rb. Достаточно того, что он находится в папке моделей, чтобы рельсы знали, что это такое :) - person PaReeOhNos; 01.08.2013
comment
Хм, мне очень жаль, что это смущает, но это была опечатка с моей стороны... на самом деле это называется pages.rb... - person averroes; 01.08.2013
comment
Ааа ок :P Не волнуйтесь. Возможно, вы также захотите сделать его единственным, поэтому page.rb вместо pages.rb. К сожалению, Rails может быть довольно придирчивым к соглашению об именах. - person PaReeOhNos; 01.08.2013
comment
Хм ... теперь он говорит мне кое-что ... спасибо за то, что вы были так терпеливы со мной, я не осознавал, что у меня все так плохо с RoR ... :( Я обновил вопрос с изображением моего страшного сообщения об ошибке - person averroes; 01.08.2013
comment
Это нормально, не проблема. К Rails немного сложно привыкнуть, поскольку они очень разборчивы в том, как они работают. Не видите картинку? - person PaReeOhNos; 01.08.2013
comment
Черт, видимо, мне нужно 10 очков репутации... LOL. Это такой провал. Вот моя ошибка: СИНТАКСИЧЕСКАЯ ОШИБКА В PAGESCONTROLLER#CREATE C:/Sites/Logixity/app/models/page.rb:9: синтаксическая ошибка, неожиданный tASSOC, ожидание ключевого слова_end :subject =› #{page_title} ^ C:/Sites/Logixity /app/models/page.rb:10: синтаксическая ошибка, непредвиденный tASSOC, ожидание ключевого_конца :to =›[email protected] ^ C:/Sites/Logixity/app/models/page.rb:11: синтаксическая ошибка, непредвиденное tASSOC, ожидается keyword_end :from =› %(#{name} ‹#{email}›) ^ - person averroes; 01.08.2013
comment
AHH хорошо, это довольно прямолинейно. Вам просто не хватает фигурных скобок в методе headers. Вы пытаетесь создать хэш, но без фигурных скобок ruby ​​не понимает, что вы пытаетесь сделать. Просто измените его на { :subject => ........., }, и это должно исчезнуть :) - person PaReeOhNos; 01.08.2013
comment
Это все еще дает мне эту ошибку. В настоящее время у меня есть заголовки def { :subject =› #{page_title}, :to =›[email protected], :from =›%(#{name} ‹#{email}›)} end - person averroes; 01.08.2013
comment
Ну, на самом деле это неожиданное '{', ожидающее ';' или '/ п' - person averroes; 01.08.2013
comment
хм, вы поместили открытие { в ту же строку, что и определение? Они должны быть на разных линиях. То же самое с закрывающими } и end - person PaReeOhNos; 01.08.2013
comment
О БОЖЕ СПАСИБО НАКОНЕЦ-ТО РАБОТАЕТ! Спасибо!!! Если есть какой-либо способ, которым я могу помочь вам, дайте мне знать!!!! - person averroes; 01.08.2013
comment
ха, нет проблем, рад, что это работает :) Просто дайте мне знать, если у вас возникнут какие-либо другие проблемы - person PaReeOhNos; 01.08.2013