使用ActiveModel以实现“联系我们”表单时遇到问题

时间:2011-08-07 15:41:08

标签: ruby-on-rails ruby ruby-on-rails-3 forms 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 个答案:

答案 0 :(得分:0)

尝试替换

<%= 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像您一样