Это немного сложно прочитать, но, похоже, вы здесь обучаетесь по собственному усвоению.Несколько вещей:
- Практически каждый программист должен выучить и запомнить , если вам нужно прокрутить, чтобы прочитать всю функцию или метод., это слишком долго! :)
- Потратив некоторое время на организацию своего кода и его абстрагирование в организованные классы и методы, вам и другим будет легче понять, чтопродолжить и найти ошибки (методы упорядочения в том же логическом порядке, в котором они будут вызываться, также полезны)
- Программа, которую вы пишете, выиграет от использования операторов 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 *