我是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
我在这里缺少什么?
答案 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