Проблемы с использованием ActiveModel для реализации формы "Свяжитесь с нами"
Я использую Ruby on Rails 3.0.9 и пытаюсь реализовать форму "Связаться с нами" самостоятельно. Так...
... в моем файле модели у меня есть:
require 'active_model'
class ContactUs
include ActiveModel::Conversion
include ActiveModel::Validations
attr_accessor :email, :subject, :message
def initialize(attributes = {})
@attributes = attributes
end
validates :email,
:presence => true
validates :subject,
:presence => true
validates :message,
:presence => true
def persist
@persisted = true
end
def persisted?
false
end
end
... в моем файле просмотра у меня есть:
<%= form_for @contact_us, :url => contact_us_path do |f| %>
<%= f.text_field :email %>
<%= f.text_field :subject %>
<%= f.text_area :message %>
<% end %>
... в моем файле маршрутизатора у меня есть:
match 'contact_us' => 'pages#contact_us', :via => [:get, :post]
... в моем файле контроллера у меня есть:
class PagesController < ApplicationController
def contact_us
case request.request_method
when 'GET'
@contact_us = ContactUs.new
when 'POST'
@contact_us = ContactUs.new(params[:contact_us])
end
end
end
Используя приведенный выше код, когда я отправляю форму с хотя бы пустым полем (я делаю это для того, чтобы она не прошла валидацию), и форма перезагружается, я не получаю эти поля автоматически. То есть после перезагрузки формы (это происходит после нажатия кнопки отправки) все значения полей устанавливаются пустыми.
В чем проблема? Я ошибаюсь при использовании ActiveModel
?
1 ответ
Попробуй заменить
<%= form_for @contact_us, :url => contact_us_path do |f| %>
<%= f.text_field :email %>
<%= f.text_field :subject %>
<%= f.text_area :message %>
<% end %>
с
<%= form_for @contact_us, :url => contact_us_path do |f| %>
<%= f.text_field :email, :value => @contact_us.email %>
<%= f.text_field :subject, :value => @contact_us.subject %>
<%= f.text_area :message, :value => @contact_us.message %>
<% end %>
РЕДАКТИРОВАТЬ:
Я полагаю, вам придется добавить функциональность массового назначения, например, так:
def initialize(attributes = {})
attributes.keys.each do |attr|
self.class.send(:attr_accessor, attr.to_sym)
instance_variable_set "@" + attr.to_s, attributes[attr.to_sym]
end
end
Вы можете пропустить эту строку: self.class.send(:attr_accessor, attr.to_sym)
если ты хочешь иметь attr_accessor :email, :subject, :message
как ты уже