0

我是 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 %>

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

ActiveModel::MissingAttributeError 缺少属性:first_name

我在这里想念什么?

4

1 回答 1

3

如果你在这个模型后面没有数据库表,你就会倒退。无需从 ActiveRecord::Base 继承,只需创建一个常规类并包含您需要的 Rails 组件。这是一个 StackOverflow 答案,它显示了这一点:Ruby on Rails:全功能无表模型。或者,如果您使用的是 Rails 4,那么现在它会变得更加容易,因为您所要做的就是include ActiveModel::Model. 这是一篇文章: http: //blog.remarkablelabs.com/2012/12/activemodel-model-rails-4-countdown-to-2013

于 2013-09-16T18:14:03.300 回答