Тег Rails 4 form_for оставляет действие формы пустым

Я создаю базовую форму на рельсах, и по какой-то причине, когда я создаю форму, действие пусто, и, следовательно, я получаю сообщение об ошибке маршрутизации «Нет совпадений маршрута [POST] «/contacts/new»

Вот код просмотра:

<%= form_for  :contact,  :url => {:action => "create"} , html: { class: "contact-form"} do |f| %>

  <div class="form-group col-md-12 col-sm-12 col-xs-12">
    <h4>Choose your option below</h4>
     <%= f.label :option, class: 'sr-only' %>
     <%= f.select :option, options_for_select(["I would like to reserve a place for myself", "I would like Better Place for ashes I currently possess", "I would like Better Place for ashes currently at a funeral home", "I operate a funeral home and would like to know more"]), {}, multiple: false, class: "form-control" %><br />
  </div>
  <div>
    <h4>Please provide us with some details</h4>
  </div>

  <div class="col-md-6 col-sm-6 col-xs-12 form-group">
    <%= f.label :name, class: 'sr-only' %>
    <%= f.text_field :name, placeholder: "Your name", class: 'form-control', style: "height: 40px;" %><br />
  </div>

  <div class="col-md-6 col-sm-6 col-xs-12 form-group">
    <%= f.label :email, class: 'sr-only' %>
    <%= f.text_field :email, placeholder: "Your email", class: 'form-control', style: "height: 40px;" %><br />
  </div>

  <div class="col-md-6 col-sm-6 col-xs-12 form-group">
    <%= f.label :phone, class: 'sr-only' %>
    <%= f.text_field :phone, placeholder: "Your phone", class: 'form-control', style: "height: 40px;" %><br />
  </div>

  <div class="col-md-12 col-sm-12 col-xs-12 form-group">
    <%= f.label :comments, class: 'sr-only' %>
    <%= f.text_area :comments, placeholder: "Enter any comments or questions here", class: "form-control",:rows => "6" %>
  </div>

  <div class="col-md-12 col-sm-12 col-xs-12 form-group">
    <%= f.submit 'Submit Details', class: 'btn btn-block btn-cta btn-cta-primary'  %>
  </div>  
<% end %>

И вот получившаяся форма в html:

<form id="contact-form" class="contact-form" method="post" action=""> 

Когда я запускаю rake route, появляется правильный маршрут (contacts_path):

     pages_home GET  /pages/home(.:format)    pages#home
         root GET  /                        pages#home
  pages_about GET  /pages/about(.:format)   pages#about
pages_options GET  /pages/options(.:format) pages#options
    pages_faq GET  /pages/faq(.:format)     pages#faq
     contacts POST /contacts(.:format)      contacts#create
  new_contact GET  /contacts/new(.:format)  contacts#new

И когда я отправляю форму, она пытается выполнить POST для нового действия вместо действия создания, поэтому я получаю: Маршрут не соответствует [POST] "/contacts/new"

Мой вопрос: почему действие формы остается пустым, когда существует соответствующий маршрут, и что я могу сделать, чтобы исправить это?

Спасибо!

Отредактировано, чтобы показать контроллер ниже:

    class ContactsController < ApplicationController

  def new
    @contact = Contact.new
  end

  def create
    @contact = Contact.new(contact_params)
    @option = params[:contact][:option]
    @name = params[:contact][:name]
    @email = params[:contact][:email]
    @phone = params[:contact][:phone]
    @comments = params[:contact][:comments]

    if @contact.save
      redirect_to new_contact_path, :notice => "Thanks for contacting us! We'll be in touch shortly."
    else
        render new_contact_path
        flash[:notice] = "Oops. Please enter the correct information and try again."
    end
  end

  private

  def contact_params
    params.require(:contact).permit(:option, :name, :phone, :email, :comments)
  end

end

person rails_newbie    schedule 24.03.2015    source источник
comment
Как выглядит ваш контроллер для #new и #create?   -  person Beartech    schedule 24.03.2015
comment
Кроме того, когда вы просматриваете форму, какой адрес находится в адресной строке? Я думаю, это может быть связано с нестандартными маршрутами, поэтому Rails делает предположения, которые не соответствуют действительности. Вы можете попробовать установить маршрут POST на post 'new_contact' => 'contacts#create'   -  person Beartech    schedule 24.03.2015
comment
Контроллер выглядит так:   -  person rails_newbie    schedule 24.03.2015
comment
Контроллер выглядит так: code def new @contact = Contact.new end def create @contact = Contact.new(contact_params) @option = params[:contact][:option] @name = params[:contact][:name] @ email = params[:contact][:email] @phone = params[:contact][:phone] @comments = params[:contact][:comments] if @contact.save redirect_to new_contact_path, :notice =› Спасибо за обращение нас! Мы свяжемся с вами в ближайшее время. else render new_contact_path flash[:notice] = Упс. Введите правильную информацию и повторите попытку. конец конец   -  person rails_newbie    schedule 24.03.2015
comment
Не размещайте такой большой код в комментариях. Отредактируйте свой ответ с помощью приведенного выше кода в удобочитаемом формате.   -  person Beartech    schedule 24.03.2015
comment
Хорошее замечание - пойдет.   -  person rails_newbie    schedule 24.03.2015
comment
Зачем все эти переменные экземпляра ниже @contact в контроллере? Не имеет отношения к вашему вопросу, но просто выглядит странно.   -  person Beartech    schedule 24.03.2015
comment
Я настраивал их для использования в почтовой программе.   -  person rails_newbie    schedule 24.03.2015


Ответы (2)


Вы должны использовать form_for следующим образом:

form_for @contact, url: contacts_path, html: { class: "contact-form"} do |f|
  #                ^^^^^^^^^^^^^^^^^^ this is optional, see @nathanvda's comment

Где @contact - это переменная, установленная в действии вашего контроллера, например:

@contact = Contact.new
# you can eventually pre-fill some attributes here:
# @contact = Contact.new(user_id: current_user.id, important: false)

Это сложно: form_for принимает помощник URL, чтобы знать, куда отправить форму, в вашем случае /contacts. Вы скажете: «Но ведь это адрес действия индекса!» Я отвечу: «Да, но form_for использует запрос как POST, а не GET)

person MrYoshiji    schedule 24.03.2015
comment
Если вы используете переменную экземпляра, больше не нужно указывать URL-адрес. - person nathanvda; 24.03.2015
comment
@nathanvda спасибо, в этом случае нет необходимости указывать URL-адрес, но что, если он находится в пространстве имен? (например, в /settings/ я действительно не знаю, сработает ли это) - person MrYoshiji; 24.03.2015
comment
Пространство имен, например, под admin вы должны написать form_for [:admin, @contact] do |f| - person nathanvda; 24.03.2015
comment
Даже когда я редактирую form_for, как у вас, и устанавливаю переменную @contact (пост отредактирован для отображения контроллера), я все равно получаю пустое действие в форме, хотя в руководствах Rails сказано, что действие должно быть action=contacts/ создать при отображении формы. - person rails_newbie; 24.03.2015

Стандартное/простое решение, imho, состоит в том, чтобы написать его следующим образом:

<%= form_for @contact, html: { class: "contact-form"} do |f| %>

И в вашем new действии установите

@contact = Contact.new

Использование символа также может работать, но я думаю, вам придется написать его следующим образом:

<%= form_for :contact, :url => contacts_path, method: :post, html: { class: "contact-form"} do |f| %>

Но использование переменной экземпляра является предпочтительным способом.

person nathanvda    schedule 24.03.2015