Ошибки приложения терминала в командной строке - PullRequest
0 голосов
/ 26 сентября 2019

Я работаю над приложением командной строки с темой ресторана.Когда приложение запускается, появляется меню, и пользователю предлагается либо войти в систему или выйти.Как только пользователь входит в систему или регистрируется, появляется меню, в котором есть список вариантов выбора, чтобы пользователь мог выбрать из проблем, с которыми я сталкиваюсь ... 1. когда пользователь выбирает опцию 9, он не запускается, он просто выходитпрограмма

когда пользователь выбирает опцию 2, он говорит, что команда не найдена

, когда пользователь выбирает опцию для изменения информации о своей учетной записи, а затем, когда он завершает работу, когда выбрана опция 5, чтобы вернуться киз главного меню выходит программа

def login_screen

   puts "1. Login"
   puts "2. Create account"
   puts "3. Exit"
   $selection = gets.chomp
end

puts "Hello there!!! Welcome to My Restaurant Eats. Please select from the following...."
sleep(1)
login_screen
# selection = gets.chomp

def show_main_menu(new_customer)
  sleep(1)
  puts "HI #{new_customer.first_last_name}, please select from the following..."
  puts "1. View all restaurants"
  puts "2. View all restaurants in your borough or city"
  puts "3. View a restaurants menus"
  puts "4. Make an order"
  puts "5. View all of your orders"
  puts "6. Add to your favorites"
  puts "7. View all of your favorites"
  puts "8. View and/or change your account information"
  puts "9. Delete account"
  puts "10. Signout"
end

sleep(1)

  if $selection == '1'
   sleep(1)
   puts "Enter username"
   user_name = gets.chomp
   sleep(1)
   puts "Please enter password"
   pass_word = gets.chomp
   # binding.pry
   new_customer = Customer.find_by(username: user_name)
   new_cus_pass = Customer.find_by(password: pass_word)
   # binding.pry
     if new_customer == nil
      sleep(1)
      puts "Sorry, user not found. Please try again"
      login_screen
     elsif new_customer && !new_cus_pass
       puts "Incorrect password. Please try again"
       sleep(1)
       # binding.pry
  login_screen
    else if new_customer && new_cus_pass
    sleep(1)
 show_main_menu(new_customer)
  end
end

   elsif $selection == '2' #doesnt start
    sleep(1)
    puts "Enter your full name."
    fullname = gets.chomp
    sleep(1)


puts "Enter your email address."
   email = gets.chomp
   sleep(1)
   puts "Enter your desired username."
   user_name = gets.chomp
   while Customer.exists?(username: user_name) do


   sleep(1)
    puts "This username is already taken. Please enter a different one"
    user_name = gets.chomp
    sleep(1)
    break if !Customer.exists?(username: user_name)
 end
    sleep(1)
    puts "Enter a password of your choice"
    pass_word = gets.chomp
    new_customer = Customer.create(first_last_name: fullname, email_address: email, 
    username: user_name,
    password: pass_word)
    sleep(1)
    show_main_menu(new_customer)


    elsif $selection == '3'
     sleep(1)
     exit(0)
  end

   # $current_user = user_name
     main_menu_selection = gets.chomp

    if main_menu_selection == '1'
    sleep(1)
    view = Restaurant.view_all_restaurants
    sleep(1)
    show_main_menu(new_customer)

    elsif main_menu_selection == '2'
      sleep(1)
      puts "Enter borough or city"
      borough_city = gets.chomp
      res_locations = Restaurant.view_res_by_location(borough_city)
      puts "The resturants in the #{borough_city} are:"
         res_locations.each do |restaurant|
           puts "#{restaurant.name}."
       end
     sleep(1)
     show_main_menu(new_customer)

     elsif main_menu_selection == '3' #says undefined method when turning it into a  
     method
       puts "For which resturant would you like to view its menu?"
       # view = Restaurant.view_all_restaurants
       res_name = gets.chomp
         find = Restaurant.find_by_name(res_name) #find contains the instance of the 
         restaurnt
           puts "The menu for #{res_name}, is as follows...."
           # binding.pry
           # find_a_menu = find.menus
            find_a_menu = find.menus.select do |menu|
               menu.meal
            end
           find_a_menu.each_with_index do |menu, index|
               puts "#{index + 1}. #{menu.menu_type}"
               JSON.parse(menu.meal).each_with_index do |item|
               puts "    #{item}"
             end
            end

            elsif main_menu_selection == '5'
               my_orders = Order.all.each do |all_orders|
               all_orders.customer_id == self.customer_id
             end


            elsif main_menu_selection == '6'
               puts "What restaurant would you like to add to your favorites?"
               fav_res = gets.chomp
               fav = Restaurant.find_by(name: fav_res)
               new_favorite = Favorite.create(restaurnt_id: fav.id, customer_id:   
               new_customer.id)
               puts "You have successfully added #{fav_res} to your favorites"

             elsif main_menu_selection == '8'
               sleep(1)
               puts "1. View Account Informtion"
               puts "2. Change Account Information"
               puts "3. Back to main menu"
               select = gets.chomp
           if select == '1'
              sleep(1)
              get_info = Customer.view_customer_info(user_name)
              get_info.each do |information|
              # binding.pry
              sleep(1)
              puts "Username: #{information.username}"
              puts "First and Last Name: #{information.first_last_name}"
              puts "Email Address: #{information.email_address}"
          end
              elsif select == '2'
                while 1==1
                  sleep(1)
                   puts "1. Change Your First and Last Name"
                   puts "2. Change Your Email Address"
                   puts "3. Change Your Username"
                   puts "4. Change Your Password"
                   puts "5. Back to main menu"
                   select_another = gets.chomp
                   if select_another  == '1'
                     sleep(1)
                     puts "What would you like to change your name to?"
                     change_name = gets.chomp
                     new_customer.update_attribute(:first_last_name, change_name)
                   elsif select_another  == '2'
                     sleep(1)
                     puts "What would you like to change your email address to?"
                     change_email = gets.chomp
                     new_customer.update_attribute(:email_address, change_email)
                  elsif select_another  == '3'
                   sleep(1)
                   puts "What would you like to change your username to?"
                   change_username = gets.chomp
                   new_customer.update_attribute(:username, change_username)
                  elsif select_another  == '4'
                   sleep(1)
                   puts "What would you like your new password to be?"
                   change_password = gets.chomp
                  new_customer.update_attribute(:password, change_password)
                elsif select_another == '5'
                 break
                 sleep(1)
                show_main_menu(new_customer)
              end
            end
            elsif select == '3'
              sleep(1)
               show_main_menu(new_customer)


           elsif main_menu_selection == '9' #doesnt run
            # sleep(1)
            Customer.destroy_all(username: user_name)
            sleep(1)
            puts "Your account has been successfuly deleted"
            sleep(1)
            login_screen
         end


            elsif main_menu_selection == '10'
              sleep(1)
              puts "You have been signed out"
              sleep(1)
             login_screen
           end

1 Ответ

0 голосов
/ 27 сентября 2019

Это немного сложно прочитать, но, похоже, вы здесь обучаетесь по собственному усвоению.Несколько вещей:

  • Практически каждый программист должен выучить и запомнить , если вам нужно прокрутить, чтобы прочитать всю функцию или метод., это слишком долго! :)
  • Потратив некоторое время на организацию своего кода и его абстрагирование в организованные классы и методы, вам и другим будет легче понять, чтопродолжить и найти ошибки (методы упорядочения в том же логическом порядке, в котором они будут вызываться, также полезны)
  • Программа, которую вы пишете, выиграет от использования операторов case (https://www.rubyguides.com/2015/10/ruby-case/), которые в некоторых других языках также называются «оператором переключения»

Отступы в предоставленном вами коде очень непоследовательно отформатированы, поэтому довольно сложно понять, что многие вещи делают без тонныусилий, но я думаю, что ваша проблема здесь, как только вы подтвердите, что есть клиент с помощью else if new_customer && new_cus_pass, вы продолжаете звонить show_main_menu(new_customer),Если вы посмотрите на определение метода show_main_menu, вы печатаете различные опции на консоли, но никогда не вызываете gets.chomp, чтобы прочитать выбор.Так что это должно быть там, где вы застряли.

В качестве отступления, запрос Customer.find_by(username: user_name) AND Customer.find_by(password: pass_word) не имеет большого смысла делать, потому что:

  • Имя пользователя может быть уникальным, а пароль - нет;несколько пользователей могут решить использовать один и тот же пароль
  • Поскольку один и тот же пароль может выбрать несколько человек, new_cus_pass вернет первого клиента, у которого есть этот пароль - не обязательно право 1034 * customer
  • Совершенно неэффективно выполнять ненужные вызовы базы данных, поэтому вы всегда хотите получить то, что вам нужно в первый раз, когда это возможно.Вы также можете запросить несколько атрибутов в одном запросе, например, Customer.find_by(username: user_name, password: pass_word);если запись не найдена, find_by завершится неудачно и вернется nil.

Я потратил много времени, чтобы пройтись и реструктурировать ваш код во что-то более совместимое с лучшими практиками программирования:

def run 
  puts "Hello there!!! Welcome to My Restaurant Eats. Please select from the following...."
  process_login
end

def process_login
  case login_screen_selection 
  when '1'
    existing_user
  when '2'
    create_account
  when '3'
    exit_application
  else 
    process_login
  end
end

def login_screen_selection
  puts "1. Login"
  puts "2. Create account"
  puts "3. Exit"
  gets.chomp
end

def existing_user 
  customer = Customer.find_by(
    username: get_username, 
    password: get_password
  )
  if customer.nil? 
    customer_not_found(username)
  else
    main_menu(customer)
  end
end

def get_username
  puts 'Enter username'
  gets.chomp
end

def get_password 
  puts "Please enter password"
  gets.chomp 
end

def customer_not_found
  puts 'Sorry, username and/or password combination not valid. Please try again'
  login_screen
end

def create_account
  # You can assign the 'get' method results to a var if you want
  customer = Customer.create(
    first_last_name: get_full_name, 
    email_address:   get_email, 
    username:        get_username,
    password:        get_password
  )
  main_menu(customer)
end

def exit_application
  exit(0)
end

def get_full_name 
  puts 'Enter your full name.'
  gets.chomp
end

def get_email 
  puts 'Enter your email address.'
  gets.chomp
end 

def get_username
  puts 'Enter your desired username.'
  username = gets.chomp 
  while Customer.exists?(username: username) do
    puts "This username is already taken. Please enter a different one"
    username = gets.chomp
    break if Customer.find_by(username: username).nil?
  end
  username
end

def get_password 
  puts "Enter a password of your choice"
  gets.chomp
end

def main_menu_selection
  puts "HI #{new_customer.first_last_name}, please select from the following..."
  puts "1. View all restaurants"
  puts "2. View all restaurants in your borough or city"
  puts "3. View a restaurants menus"
  puts "4. Make an order"
  puts "5. View all of your orders"
  puts "6. Add to your favorites"
  puts "7. View all of your favorites"
  puts "8. View and/or change your account information"
  puts "9. Delete account"
  puts "10. Signout"
  gets.chomp
end

def main_menu(customer)
  case main_menu_selection
  when '1'
    view_all_restaurants
  when '2'
    view_borough_or_city(customer)
  when '3'
    view_restaurant_menu
  when '4'
    # TODO: define this
  when '5'
    view_orders(customer)
  when '6'
    add_favorite_restaurant(customer)
  when '7'
    # TODO: define this
  when '8'
    manage_account(customer)
  when '9'
    delete_account(customer)
  when '10'
    sign_out
  end
end

def view_all_restaurants
  Restaurant.view_all_restaurants
  main_menu(customer)
end

def view_borough_or_city(customer)
  puts "Enter borough or city"
  city = gets.chomp
  puts "The resturants in the #{city} are:"
  Restaurant.view_res_by_location(city).each do |restaurant|
    puts "#{restaurant.name}."
  end
  main_menu(customer)
end

def view_restaurant_menu
  puts "For which resturant would you like to view its menu?"
  name = gets.chomp
  restaurant = Restaurant.find_by_name(name) 
  puts "The menu for #{name}, is as follows...."
  menus_with_meals = restaurant.menus.select do |menu|
    menu.meal
  end
  menus_with_meals.each_with_index do |menu, index|
    puts "#{index + 1}. #{menu.menu_type}"
    JSON.parse(menu.meal).each_with_index do |item|
    puts "    #{item}"
    end
  end
end

def view_orders(customer)
  # IMO orders should have a belongs_to association with customer
  # then you could do customer.orders
  Order.where(customer_id: customer.id)
end

def add_favorite_restaurant(customer)
  puts "What restaurant would you like to add to your favorites?"
  favorite_name = gets.chomp
  restaurant = Restaurant.find_by(name: favorite_name)
  Favorite.create(
    restaurant_id: restaurant.id, 
    customer_id:   new_customer.id
  )
  puts "You have successfully added #{favorite_name} to your favorites"
end

def manage_account(customer)
  case manage_account_selection
  when '1'
    display_customer_info(customer)
  when '2'
    update_customer_info(customer)
  when '3'
    main_menu(customer)
  end
end 

def display_customer_info(customer)
  puts "Username: #{customer.username}"
  puts "First and Last Name: #{customer.first_last_name}"
  puts "Email Address: #{customer.email_address}"
end

def manage_account_selection
  puts "1. View Account Informtion"
  puts "2. Change Account Information"
  puts "3. Back to main menu"
  gets.chomp
end

def delete_account(customer)
  # You already have a reference to the customer record, use it
  customer.destroy!
  puts 'Your account has been successfuly deleted'
  login_screen
end

def update_customer_info(customer)
  while true 
    case update_customer_info_selection
    when '1'
      update_first_last_name(customer)
    when '2'
      update_email(customer)
    when '3'
      update_username(customer)
    when '4'
      update_password(customer)
    when '5'
      main_menu(customer)
    end
  end
end

def update_customer_info_selection
  puts "1. Change Your First and Last Name"
  puts "2. Change Your Email Address"
  puts "3. Change Your Username"
  puts "4. Change Your Password"
  puts "5. Back to main menu"
  gets.chomp
end

def update_first_last_name(customer)
  puts 'What would you like to change your name to?'
  customer.update!(first_last_name: gets.chomp)
end

def update_email(customer)
  puts 'What would you like to change your email address to?'
  csutomer.update!(email_address: gets.chomp)
end

def update_username(customer)
  puts 'What would you like to change your username to?'
  customer.update!(username: gets.chomp)
end

def update_password(customer)
  puts 'What would you like your new password to be?'
  customer.update!(password: gets.chomp)
end

def sign_out
  puts "You have been signed out"
  login_screen
end

# Start the entire flow with one command!
run

Пожалуйста, уделите некоторое время, чтобы детально рассмотреть переработанный код и использовать его, чтобы помочь в формировании того, как вы будете писать код в будущем.Это должно дать вам более четкое представление о том, как писать структурированный, читаемый код в соответствии с лучшими практиками программирования.Все разбито на маленькие, удобочитаемые методы, и все упорядочено в том же логическом потоке, что и в приложении.Таким образом, кодирование позволяет вам (и другим!) Понять все, что делает ваш код, и отследить ошибки.Если вам интересно, почему я завершил методы с gets.chomp, это потому, что методы Ruby всегда возвращают значение последней вещи в определении метода (в данном случае это должно быть значение, введенное пользователем в консоль).Счастливого обучения :) 1047 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...