Форма рельсов, используемая в разных частях, или как повторно использовать метод - PullRequest
0 голосов
/ 26 июня 2019

У меня есть ContactsController, который выглядит следующим образом:

class ContactsController < ApplicationController
 def create
  @contact = Contact.new(contact_params)
  if captcha?
   ContactMailer.potential_lead(@contact).deliver if @contact.save
  else
   @contact.errors.add(:base, 'Verify your humanity')
  end
  respond_with @contact
 end

 def thanks
  @contact = 'success'
  render file: '/layouts/contact'
 end

 private

 def contact_params
  params.require(:contact).permit(:name, :message, :interest, :email, :phone)
 end
end

Нет проблем с ContactsController, представлениями, почтовыми программами и т. Д. Все работает нормально.Однако мне нужно добавить отдельную страницу, и я планирую использовать ContactsController для обработки формы.Поэтому я создал новое представление в Layouts под названием widget.

Идея заключается в том, что, когда кто-то заполняет контактную форму на странице виджета, появляется скрытое поле, которое обрабатывает интерес и просто использует почтовый контакт и т. Д.

Однако я сталкиваюсь с некоторыми проблемами.На мой взгляд, у меня есть:

=content_for :body do
 .container
  .row
   .col
    =render partial: '/shared/widget_form'

Затем в моей части:

=tb_form_for @contact, remote: true, data: {errors: :inline, success: thanks_path } do |f|
 .row
  .col
   = tb_form_errors(f.object, :base)
 .row
  .col
   =f.text_field :name, class: 'form-control', placeholder: 'Name', required: true

Затем я обновил свои маршруты, чтобы иметь

resources :contacts, only: [:create]
match 'widget' -> 'contacts#create', via: :post

Однако я в конечном итоге

Первый аргумент в форме не может содержать ноль или быть пустым

Я подумал, может быть, это проблема с созданием сообщения, хотя я хочу опубликовать в Контактах> Создать, ноЯ изменил это, чтобы получить и в итоге:

параметр отсутствует или значение пусто: contact

Поэтому я подумал, что, вероятно, использую сопоставление неправильно, поэтому яя просто сделаю:

get 'widget', to: 'contacts#create', as: :widget

Затем я обновил свою форму, чтобы иметь:

=tb_form_for @contact, url: widget_path, remote: true, data: {errors: :inline, success: thanks_path}

И я все еще получаю

, параметр отсутствует илизначение пусто: контакт

Что мне не хватает?Я просто хотел бы повторно использовать метод на другой странице.

РЕДАКТИРОВАТЬ: Если я использую:

=tb_form_for Contact.new

Это работает .... но это похоже на чит.Есть ли способ обойти это?

1 Ответ

0 голосов
/ 26 июня 2019

Как рельсы отображают формы?

Короче говоря:

  1. Например, пользователь отправляет запрос на получение contacts#index
  2. Внутри #index action у вас что-то типа @contact = Contact.new
  3. По умолчанию представление index.haml будет отображаться для действия #index, если не указано другое представление.
  4. В этом случае представление index.haml сможет получить доступ к переменной @contact.

В вашем случае есть метод = content_for :body do, который делает partial: '/shared/widget_form'

Я полагаю, что где-то в другом виде или макете есть yield :body.

Таким образом, чтобы заставить его работать, вам нужно инициализировать переменную @contact в любом контроллере, который может отображать представление / макет с yield :body

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...