2014-05-18 2 views
0

나는 http://ruby.about.com/od/sinatra/a/datamapper.htm 페이지에서 예제를 시도하고있다. 내가 오류 메시지가 내가 잘못 뭐하는 거지Ruby DataMapper : 정의되지 않은 메소드`include? '

/usr/local/Cellar/ruby/2.0.0-p247/lib/ruby/gems/2.0.0/gems/dm-core-1.2.1/lib/dm-core/resource.rb:335:in `block in attributes=': undefined method `include?' for nil:NilClass (NoMethodError) 
    from /usr/local/Cellar/ruby/2.0.0-p247/lib/ruby/gems/2.0.0/gems/dm-core-1.2.1/lib/dm-core/resource.rb:332:in `each' 
    from /usr/local/Cellar/ruby/2.0.0-p247/lib/ruby/gems/2.0.0/gems/dm-core-1.2.1/lib/dm-core/resource.rb:332:in `attributes=' 
    from test.rb:16:in `<main>' 

있어, ruby test.rb에 의해

require 'rubygems' 
require 'dm-core' 
require 'dm-migrations' 

DataMapper.setup(:default, "sqlite3:///tmp/test1.db") 

class Person 
    include DataMapper::Resource 

    property :firstname, String 
    property :lastname, String 
    property :email, String, :key => true 
end 

p = Person.new 
p.attributes = { 
    :firstname => 'John', 
    :lastname => 'Doe', 
    :email => '[email protected]' 
} 

이 코드를 실행 : 나는 웹 사이트에서 다음 코드를 복사? 감사.

+2

'DataMapper.auto_migrate! '를 실행 했습니까? –

+0

@ArupRakshit 감사합니다. 그게 다야! 네가 대답하면 내가 받아 들일거야. – gefei

답변

1

다음 코드는 dm-core/lib/dm-core/resource.rb입니다.

# Assign values to multiple attributes in one call (mass assignment) 
# 
# @param [Hash] attributes 
# names and values of attributes to assign 
# 
# @return [Hash] 
# names and values of attributes assigned 
# 
# @api public 
def attributes=(attributes) 
    model = self.model 
    attributes.each do |name, value| 
    case name 
    when String, Symbol 
     if model.allowed_writer_methods.include?(setter = "#{name}=") 
     __send__(setter, value) 
     else 
     raise ArgumentError, "The attribute '#{name}' is not accessible in #{model}" 
     end 
    when Associations::Relationship, Property 
     self.persistence_state = persistence_state.set(name, value) 
    end 
    end 
end 

allowed_writer_methods 설정되지 않은 리더이다. 변수를 설정하지 않는 이유는 여러 가지가 있습니다. @allowed_writer_methods입니다. 대량 할당 할 수있는 작성자 메서드 목록은 #attributes=입니다. 이러한 이유 때문에 auto_migrate!개로 실행하지 않고 모델 정의과 일치하도록 저장소를 위쪽으로 다시 생성 할 수 있습니다. 따라서 코드가 작동하는지 여부를 확인하려면이 메소드를 실행하십시오. 위에서 이유는, allowed_writer_methodsnil주고 Nilclass#include? 방법이 존재하지 않는 것을 특징으로위한 에러 대하여

이 예는, 광고 model.allowed_writer_methods.include?(setter = "#{name}=")에서왔다. 그 이유는 (NoMethodError)입니다.