>source

누군가의 가치를 얻는 방법에 대해 나를 도울 수 있습니까?이름, 위치, 요리, 시간질문에서"넣다"logs.csv 파일에 저장 하시겠습니까?

다음과 같은 설명입니다.

  • 어떻게 든 사용자의 점심 정보를 검색합니다 (예 : 사용자가 누구인지, 어느 장소에서 먹었는지, 얼마나 많은 요리를 먹었는지, 언제 먹었는지).
  • 해당 정보를 데이터베이스 파일에 저장
  • 그 정보를 검색하고 아래는 내 코드입니다 ...
  • class UserLunch
      def initialize(name, location, dishes, time)
        @name = name
        @location = location
        @dishes = dishes
        @time = time
      end
      
         def save_to_csv(csv)
        CSV.open("C:/ruby/logs.csv", "w") do |row|
          row << %w[name location dishes time]
          all.each { |user| csv << user }
        end
      end
      
      def self.read_from_csv(csv)
         CSV.foreach("C:/ruby/logs.csv") do |row|
         puts row ['name', 'location', 'dishes', 'time']
       end
     end
         
      def names
        puts 'Register your name here?'
        name = gets.chomp
        name = 'Guest' if name.empty?
        puts "Hello #{name}"
      end
      def logs
        puts "Hello, "
        puts 'Where did you had your lunch?'
        location = gets.chomp
        location = 'unknown location' if location.empty?
        puts 'What did you eat?'
        dishes = gets.chomp
        dishes = 'unknown dishes' if dishes.empty?
        puts "I ate #{dishes} at #{location}"\
        " at "
        now = DateTime.now
        puts now
      end
      def displays
        puts "Display logs? (y/n?)"
        display = gets.chomp
        display.load('lunchlogs.csv') if display == "y"
        puts "no logs to display" if display != "n"
      end
      end
    
    

    이 부분에 문제가 있습니다. logs.csv에서 쓰거나 읽을 수 없습니다.

    다양한 옵션을 시도했습니다. 어떤 팁? 감사.

     def save_to_csv(csv)
        CSV.open("C:/ruby/logs.csv", "w") do |row|
          row << %w[name location dishes time]
          all.each { |user| csv << user }
        end
      end
      
      def self.read_from_csv(csv)
         CSV.foreach("C:/ruby/logs.csv") do |row|
         puts row ['name', 'location', 'dishes', 'time']
       end
     end
           
    
    

    • 답변 # 1

      코드의 일부를 읽기 쉽고 깔끔하게 수정하겠습니다. 최종 코드는 다음과 같습니다.

      require 'csv'
      class LunchLog
        attr_accessor :name, :location, :dishes, :time
        def initialize(name, dishes, location, time)
          @name = name
          @dishes = dishes
          @location = location
          @time = time
        end
        def save_to_csv
          CSV.open('logs.csv', 'a+') do |row|
            row << attrs
          end
        end
        def self.read_from_csv
          CSV.foreach('logs.csv') do |row|
            puts new(*row).to_s
          end
        end
        def to_s
          "#{name} ate #{dishes} at #{location} at #{time}"
        end
        def attrs
          [name, dishes, location, time]
        end
      end
      class Console
        class << self
          def init_menu
            menu = "Welcome to pandan lunch log. choose menu:\n1. Add new lunch log\n2. List log"
            case get_input(menu, %w[1 2])
            when '1'
              record
            when '2'
              display
            end
          end
          def record
            location = get_input('Where did you had your lunch?')
            dishes = get_input('What did you eat?')
            name = get_input('Register your name here?')
            l = LunchLog.new(name, dishes, location, Time.now)
            l.save_to_csv
            puts l.to_s
          end
          def display
            i = get_input('Display logs? (y/n?)', %w[y n])
            if i == 'y'
              LunchLog.read_from_csv
            else
              puts 'no logs to display'
            end
          end
          def get_input(prompt, valid_attrs = nil)
            loop do
              puts prompt
              input = gets.chomp
              if (valid_attrs && !valid_attrs.include?(input)) || input.empty?
                s = valid_attrs.nil? ? 'Invalid value' : "Invalid value, please input #{valid_attrs}"
                puts s
                next
              end
              return input
            end
          end
        end
      end
      Console.init_menu
      
      
      

      코드가 작동하지 않는 이유 :

      CSV를로드하지 않았습니다. 사용하려는 경우 CSV 기준 치수, require csv 첫째로.

      예외가 너무 많다 end 코드 끝에.

      코드를 개선 할 수있는 곳

      코드의 기능이 무엇이든 이해하기 쉽고 우아해야합니다.

      읽을 수있는 코드를 작성하려면 각 클래스의 기능과 책임을 분리해야합니다. 귀하의 코드에서 UserLunch 클래스의 책임은 단일하지 않으며 점심 로그를 기록 할뿐만 아니라 명령 줄 상호 작용 기능도 담당합니다. 매우 혼란 스럽습니다.

      우아한 코드를 작성하려면 자신을 반복하지 마십시오. 사용자 입력을 얻기 위해 코드에 유사한 문이 많이 있습니다. 이것은 재사용을위한 방법으로 추상화 될 수 있습니다.

  • 이전 c - 파일 크기를 알 수없는 경우 분할 오류의 원인을 감지하는 방법은 무엇입니까?
  • 다음 Java에서 이러한 배열 초기화의 차이점은 무엇입니까?