2017-10-15 5 views
1

私はルビーで新しくなっていますので、ご迷惑をおかけください。ユーザーデータをCSVファイルに保存します

私は、メソッドが作成し、すべてのユーザーがこれは私が呼ん

class User 
    attr_accessor :name, :age, :email 

    def initialize(name:, age:, email:) 
    @name = name 
    @age = age 
    @email = email 
    end 

    def create 
    @users = [@name, @age, @email] 
    end 

    def self.all 
    ObjectSpace.each_object(self).map(&:create) 
    end 

    def self.save_to_csv 
    CSV.open(users.csv, "w") do |csv| 
    @users.each { |i| csv.puts "#{i.name}, #{i.age}, #{i.email}" } 
    end 
end 
end 

を実行しようとしました何であるCSVのデータが

ファイル「ユーザー」を保存する必要が示していたクラス「ユーザー」を持っています

User.all 

それは私のユーザーの配列で私の配列を返しますが、コール

User.all.save_to_csv 

は、それはそれは、配列だ、

<main>': undefined method `save_to_csv' for [["user1"], ["user2"], etc] 

、適切に

答えて

0

User.allは、すべてのユーザーのinstanciesとその属性の配列を返しやるべきですか助けてください私にエラーを示して、あなたはいませんでしたArrayオブジェクトの場合はsave_to_csvと定義されています。

あなたがUser.save_to_csvを試みることができる、それは、CSVファイルを開いて、そこにユーザーの情報を書き込むためのクラスメソッドですが、他の問題があります、あなたのクラスには@users変数がありませんので、nilの値を取るよ、とnil:NilClassの場合はeachの方法はありません。

だから、allメソッドを使用して、すべてのユーザーにアクセスしてから反復することができると思います。この後

あなたはCSVファイルの行にユーザーのデータを配列にプッシュすることができます:

def self.save_to_csv 
    CSV.open('users.csv', 'w') do |csv| 
    all.each { |user| csv << user } 
    end 
end 

csv.putsは動作しません。

+0

私はメソッド "all"を変更する必要があると思いますが、それを正しく行う方法を理解していません。 –

+0

'self.save_to_csv'メソッドで' all.each'は 'self.all'メソッドを' each 'メソッドを' User.all.save_to_csv'として呼び出す代わりに、メソッドを連鎖させることなく 'User.save_to_csv'を行うことができます。 –

関連する問題