如何创建类的空实例?

时间:2013-09-16 18:03:09

标签: ruby-on-rails activerecord

我是Ruby的新手,到目前为止,我发现它与我的普通编程语言C#相比令人困惑。我正在努力的当前事情是我有一个扩展ActiveRecord::Base的类,但代表一个未保存到数据库的模型,仅用于内存。这样做的目的是我可以使用ActiveRecord的验证功能。

模型

class NewsletterSignup < ActiveRecord::Base
  attr_accessible :first_name, :last_name, :email, :zip

  def self.columns()
    @columns ||= [];
  end

  def self.column(name, sql_type = nil, default = nil, null = true)
    columns << ActiveRecord::ConnectionAdapters::Column.new(name, default, sql_type, null)
  end

  def persisted?
    false
  end

  column :first_name, :string
  column :last_name, :string
  column :email, :string
  column :zip, :string

  validates :first_name, :last_name, :email, :zip, :presence => true
  validates :email, :format => /^[-a-z0-9_+\.]+\@([-a-z0-9]+\.)+[a-z0-9]{2,4}$/i
  validates :zip, :format => /^\d{5}$/
end

部分视图

<%= simple_form_for NewsletterSignup.new ... do |f| %>
    <%= f.input :first_name, :label => "First Name:" %>
    <%= f.input :last_name, :label => "Last Name:" %>
    <%= f.input :email, :label => "Email:" %>
    <%= f.input :zip, :label => "Zip:" %>

    ...
<% end %>

我想将空模型传递给表单,以便验证起作用。但是,在尝试实例化NewsletterSignup而不提供属性/值时,这会给我一个错误:

  

::加载ActiveModel MissingAttributeError   缺少属性:first_name

我在这里缺少什么?

1 个答案:

答案 0 :(得分:3)

如果此模型后面没有数据库表,那么您将向后看这个问题。而不是从ActiveRecord :: Base继承,只需创建一个常规类并包含您需要从Rails中获得的组件。这是一个StackOverflow答案,显示了这一点:Ruby on Rails: Fully functional tableless model。或者如果您正在使用Rails 4,那么现在就更容易了,因为所有您需要做的就是include ActiveModel::Model。这是一篇关于它的文章:http://blog.remarkablelabs.com/2012/12/activemodel-model-rails-4-countdown-to-2013