2015-08-28 2 views
0

Я использую активную запись с рубином (но не рельсами). Я использую sqlite3, у которого есть файл test.db (не только в памяти). Когда я запускаю следующий фрагмент кода с помощью user.create, он жалуется на ошибку аргумента (и, когда я использую use.save, он выбрасывает активное исключение записи. Любая идея, что я могу делать неправильно? Спасибоактивная запись с рубином (не рельсы)

require 'rubygems' 
    gem 'activerecord' 

    require 'sqlite3' 
    require 'active_record' 

    ActiveRecord::Base.logger = Logger.new(STDERR) 
    #ActiveRecord::Base.colorize_logging = false 

    ActiveRecord::Base.establish_connection(
     :adapter => 'sqlite3', 
     :host => "localhost", 
     :database => 'test.db' 
    ) 

    class User < ActiveRecord::Base 
     #attr_accessible :email, :full_name 
     attr_accessor :email 
     attr_accessor :full_name 

    validates :email, presence: true, uniqueness: true 

     def initialize(email, full_name) 
     @email = email 
     @full_name = full_name 
     end 
    end 

    puts "full_name for user:" 
    full_name = gets.chomp 
    puts "email address:" 
    email = gets.chomp 
    user = User.new(email, full_name) 
    #user.save 
    user = User.create!(email: '', full_name: '') 

Исключение в первом случае (с User.create!):

main.rb:42:in `initialize': wrong number of arguments (1 for 2) (ArgumentError) 
     from /var/lib/gems/1.9.1/gems/activerecord-4.2.4/lib/active_record/inheritance.rb:61:in `new' 
     from /var/lib/gems/1.9.1/gems/activerecord-4.2.4/lib/active_record/inheritance.rb:61:in `new' 
     from /var/lib/gems/1.9.1/gems/activerecord-4.2.4/lib/active_record/persistence.rb:50:in `create!' 
     from main.rb:55:in `<main>' 
+0

Не могли бы вы предоставить stacktrace исключения? –

+0

@JeanBob добавил - спасибо – user3813256

ответ

1

Он жалуется методом new. Согласно документации: (http://api.rubyonrails.org/classes/ActiveRecord/Base.html), вам не нужен initialize, потому что, когда вы наследуете от ActiveRecord::Base, вам нужно инициализировать объекты с помощью хэша.

user = User.new({email: email, full_name: full_name}) 
# or 
user = User.new(email: email, full_name: full_name) 
# then 
user.save 

Вы должны уронить initialize и attr_accessor из вашего кода.

+0

работал - спасибо – user3813256

1

Try на комментарий пользователя # инициализировать метод и создать нового пользователя, как это:

User.create! email: '[email protected]', full_name: 'Halk' 

Объяснение

Когда вы объявляете модель AR по наследию от ActiveRecord::Base класса вам не нужно, чтобы определить свой собственный #initialize метод. Но ты делаешь. Когда вы вызываете метод User::create!, вы передаете только один аргумент - Hash с двумя парами (с ключами электронной почты и full_name). Но User#initialize определяют два параметра - адрес электронной почты и полное имя отдельно. Так рубин исключение поднимать и говорить об этом:

wrong number of arguments (1 for 2) (ArgumentError) 
+0

по какой-то причине, этот синтаксис дал мне ошибку - возможно, я сделал что-то неправильно. Но ваш главный вопрос правильный – user3813256

+1

О, извините, я передаю ключ 'name' вместо' full_name'. Ред. – Psylone

Смежные вопросы