@RStudent

Как сделать форму «Заказать звонок» без перезагрузки страницы?

Здравствуйте.

Пытаюсь реализовать форму "Заказать звонок". Форма находится на каждой страницы. Делаю по методу "Модель без таблицы в БД". (Другого способа не нашел) Сразу возникли проблемы с тем что не смог привязать форму к объекту модели. Пришлось делать так (прочитал что так не рекомендуется делать)

= form_for Message.new do |f|
...

Если
= form_for @message do |f|
...

то ругается "First argument in form cannot contain nil or be empty", хотя в контроллере вроде все верно.

Собтвенно вопрос сейчас в другом. Можно ли сделать так, чтобы форма после отправки данных не перезагружала страницу? На данный момент он бросает на ту же страницу с которой отправляются данные только с POST, которой конечно же у меня нет.

Модель
class Message
	include ActiveModel::Validations
	include ActiveModel::Conversion
	extend ActiveModel::Naming

	attr_accessor :name, :phone

	validates_presence_of :name
	validates_format_of :phone, :with => /\A[0-9]{10}\Z/, :allow_blank => true, :allow_nil => true

	def initialize(attributes = {})
		attributes.each do |name, value|
			send("#{name}=", value)
		end
	end

	def persisted?
		false
	end
end


Контроллер
class MessagesController < ApplicationController
	def new
		@message = Message.new
	end

	def create
		@message = Message.new(params[:message])
		if @message.valid?
			UserMailer.create_page(@page).deliver
			flash[:notice] = "Message sent"
		else
			render :new
		end
	end
end

В роутах сделал пока resources :messages

С уважением.
  • Вопрос задан
  • 2818 просмотров
Решения вопроса 1
1. Эта форма отображается на каждой странице, следовательно переменная @message так же должна быть установлена на каждой странице, а не только в контроллере Messages. Т.е., если Вы отображаете эту форму на странице постов и конкретного поста, то в каком-нибудь PostsController в методах show и index эта переменная должна быть так же определена.

2. Чтобы форма не перезагружала страницу, достаточно передать ей параметр remote: true. А что сделать после сабмита, опишите в соответствующей JS вьюхе (к примеру messages/create.js.erb)

= form_for @message, remote: true do |f|
...


Подробнее читайте здесь: edgeguides.rubyonrails.org/working_with_javascript...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
gejarufu
@gejarufu
Я делал что-то похожее. Только не использовал js вьюху а отправлял сразу с контроллера.
Но никак не смог сделать его рабочим.

что-то вроде
@message = Message.new(params[:message])
@company = Company.friendly.find(params[:name])

if @message.valid?
	UserMailer.call(@company).deliver
	render json: @message, status: :ok
else
	render json: @message.errors, status: :unprocessable_entity
end


Каким образом можно достать @company? пишет Couldn't find Company without an ID.
Используя гем FriendlyId, соответвенно в модели без таблицы не получается подключить FriendlyId, пишет undefined method `relation' for class `Class'.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы