Настройка простой почтовой формы Rails 5

Прошло некоторое время с тех пор, как я программировал в Rails... узнавая все о синтаксисе и изменениях Rails 5.0.

Использование Rails 5.0.0.1

Использование Ruby ruby ​​2.3.1p112 (26 апреля 2016 г., редакция 54768) [x86_64-darwin16]

Я пытаюсь настроить простую форму обратной связи на целевой странице. Я собираюсь отправить электронное письмо прямо из формы, а не сохранить его в базе данных.

Я использую гем mail_form и следую этому поток

Я знаю, что делаю некоторые ошибки новичка на своих контроллерах, но после нескольких вопросов и ответов по стеку я все еще не совсем там.

Модель успешно отправляет электронную почту в Rails Console. Я просто не могу заставить контроллер работать. Это одностраничный сайт, поэтому я добавляю фрагменты на страницу индекса в папку просмотра страниц.

Ошибка, которую я получаю

AbstractController::ActionNotFound (The action 'create' could not be found for PagesController):

Маршруты

 Rails.application.routes.draw do
  get 'users/new'
  resources :pages
  root 'pages#index'
end

Частичная форма

приложение/просмотры/страницы/_form.html.erb

<%= form_tag(pages_path)  do %>
    <div class="row">
        <div class="column width-6">
            <%= text_field_tag 'firstname', nil, class: 'form-element rounded large', placeholder: 'First Name*', tabindex: '1' %>
        </div>
        <div class="column width-6">
            <%= text_field_tag 'lastname', nil, class: 'form-element rounded large', placeholder: 'Last Name*', tabindex: '2' %>
        </div>
        <div class="column width-6">
            <%= email_field_tag 'email', nil, class: 'form-element rounded large', placeholder: 'Email Address*', tabindex: '3' %>
        </div>
        <div class="column width-6">
            <%= text_field_tag 'website', nil, class: 'form-element rounded large', placeholder: 'Website', tabindex: '4' %>
        </div>
        <div class="column width-6">
            <%= text_field_tag 'phone', nil, class: 'form-element rounded large', placeholder: 'Phone', tabindex: '5' %>
        </div>
    </div>
    <div class="row">
        <div class="column width-12">
            <%= text_area_tag 'message', nil, class: 'form-element rounded large', placeholder: 'Message*', tabindex: '6' %>
        </div>
        <div class="column width-12">
            <%= submit_tag 'Send Email', class: 'form-submit button rounded medium bkg-theme bkg-hover-green color-white color-hover-white'  %>
        </div>
    </div>
<% end %>

Контроллер страниц

class PagesController < ApplicationController
  def index
    @contact = Page.new(params[:page])
    if @contact.deliver
      redirect_to :back, :notice => "Thank you for contacting us, We'll get back to you shortly!"
    else
      flash.now[:error] = 'Sorry, it looks like there was an error with your message, Please give us a call or shoot us a text at ....'
    end
  end
end

Спасибо за помощь. Это удивительное сообщество!


person DaveG    schedule 27.09.2016    source источник
comment
вам нужно добавить resources :pages в ваш routes.rb файл   -  person Blair Anderson    schedule 27.09.2016


Ответы (2)


Ваши маршруты отсутствуют для контроллера страниц.

в config/routes.rb добавить:

resources :pages

в PagesController.rb

class PagesController < ApplicationController
  def create
    @contact = Page.new(params[:page])
    if @contact.deliver
      redirect_to :back, :notice => "Thank you for contacting us, We'll get back to you shortly!"
    else
      flash.now[:error] = 'Sorry, it looks like there was an error with your message, Please give us a call or shoot us a text at ....'
    end
  end
end

который обрабатывает AJAX posts.

person Blair Anderson    schedule 27.09.2016
comment
Я изменил маршруты... но затем получил следующую ошибку... AbstractController::ActionNotFound (не удалось найти действие "создать" для PagesController): - person DaveG; 27.09.2016
comment
ты изучаешь рельсы, продолжай. я бы очень рекомендовал прочитать guides.rubyonrails.org/routing.html - в вашем терминале запустите rake routes и вы увидите, что было создано 7 маршрутов, и ваша форма указывает на create, а не на index... измените имя вашего метода в контроллере с index на create, и он будет работать. - person Blair Anderson; 27.09.2016

redirect_to :back устарела в rails 5. Вместо этого есть новая функция redirect_back.

Но я бы не стал использовать действие index для создания новой страницы, даже если вы не сохраните ее в базе данных. Вместо этого я бы определил новое действие под названием create и перенаправил бы его на index в конце. Поскольку вы уже используете resources :pages в маршрутах, вам не нужно ничего добавлять туда. Здесь вы найдете маршруты по умолчанию и их действия, а также то, для чего их следует использовать: http://edgeguides.rubyonrails.org/routing.html#resource-routing-the-rails-default

Также я бы рассмотрел возможность использования form_for вместо form_tag, если вы работаете с моделью. Вот простой пример: http://edgeguides.rubyonrails.org/getting_started.html#the-first-form

Надеюсь, это немного помогло :)

person Zora Fuchs    schedule 27.09.2016
comment
Спасибо Зора. Это простая маркетинговая страница, поэтому я пытался избежать настройки базы данных и, таким образом, избегал form_for... кажется излишним. - person DaveG; 27.09.2016