Проблема построения ActiveModel в Ruby on Rails 3 с использованием пространств имен - PullRequest
1 голос
/ 05 марта 2011

Я использую Ruby on Rails 3 и пытаюсь построить ActiveModel таким образом :

module Users # I use a namespace
  class Account
    extend ActiveModel::Naming
    extend ActiveModel::Translation
    include ActiveModel::Validations

    attr_accessor :name
    attr_reader :errors

    def initialize
      @errors = ActiveModel::Errors.new(self)
    end

    def validate!
      errors.add(:name, "can not be nil") if name == nil
    end

    # The following methods are needed to be minimally implemented

    def read_attribute_for_validation(attr)
      send(attr)
    end

    def Account.human_attribute_name(attr, options = {})
      attr
    end

    def Account.lookup_ancestors
      [self]
    end


    def persisted?
      false
    end
end

Если в моем контроллере я делаю это

def create
  @account = Users::Account.new
  @account.errors.add( :name, "can not be blank" )
  ...
end

Я получаю эту ошибку:

undefined method `add' for nil:NilClass

Если я сделаю

@new_account = Users::Account.new

, отладка @new_account будет

--- !ruby/object:Users::Account 
id: 
name: 
surname: 
updated_at: 

Где находитсяошибка и как я могу это решить?


PS: я не хочу использовать validate_presence_of, потому что мне нужен другой процесс проверки, но я думаю, что и этот метод неработа.


Если я использую метод validate!, я получаю следующую ошибку, которая относится к этому

NoMethodError in Users/accountsController#create

You have a nil object when you didn't expect it!
You might have expected an instance of ActiveRecord::Base.
The error occurred while evaluating nil.[]=

Application trace
pp/models/users/account.rb:16:in `validate!'

1 Ответ

3 голосов
/ 05 марта 2011

Я думаю, что ActiveModel :: Validations автоматически определяет ошибки для вас.Вы, вероятно, перезаписываете это, когда определяете

attr_reader :errors
...