2013-09-16 2 views
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 %> 

내가 유효성 검사가 작동하도록 폼에 빈 모델을 전달하려는.

ActiveModel :: MissingAttributeError 없는 속성 : :하지만이 날은 속성/값을 제공하지 않고 NewsletterSignup를 인스턴스화하는 동안 오류 제공 내가 여기 실종 무엇

FIRST_NAME?

+0

어떤 레일 버전을 사용하고 있습니까? – depa

답변

3

이 모델의 뒤에 데이터베이스 테이블이 없으면 뒤로 이동합니다. ActiveRecord :: Base를 상속하는 대신 정규 클래스를 만들고 레일스에서 ​​필요한 구성 요소를 포함하십시오. 여기에 이것을 보여주는 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

+1

또한이 게시물은 레일 핵심 멤버에 의해 : http://blog.plataformatec.com.br/2012/03/barebone-models-to-use-with-actionpack-in-rails-4-0/ – depa

+0

@pdobb - 그것 때문에 고마워, 잘 작동하는 것 같다. 내가 말했듯이, 나는 Ruby/Rails가 처음이다.'class << self'와'def initialize (attributes = {}) '블록의 목적이 당신이 링크 한 대답에 무엇을 정교하게 만들 수 있습니까? 이러한 기능을 수행하는 데 어떤 역할이 있습니까? –

+0

'class << self'는 클래스 메소드를 작성하는 또 다른 방법입니다. 더 일반적인 패턴은 단지'def self. '. 그래서이 경우 그는'def self.all' 클래스 메소드를 정의하여 빈 배열을 리턴합니다. 그런 다음'def initialize (attributes = {})'는 새로운 객체가 클래스에서 인스턴스화 될 때 호출되는 메소드입니다. 그래서'MyObject.new (a : 1)'은 hash {{a : 1}}을 속성으로 전달하는'initialize'를 호출 할 것입니다. 객체 인스턴스화에 속성을 설정하고 싶다면'initialize' 메소드를 이런 방식으로 오버라이드 할 수 있습니다. – pdobb

관련 문제