Проблемы с использованием 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 как ты уже

Другие вопросы по тегам