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

И тут, конечно, меня осенило. Маппеты. Они были ключом ко всему.

Увидев, как Disney + добавляет на свою платформу весь оригинальный сериал, мы с женой проглотили несколько эпизодов. И я их любил. Я так любил их, что знал, что мой следующий проект (возможно, следующие несколько) будет связан с маппетом. Это был единственный выход.

Раньше у меня был некоторый опыт работы с маршрутами и запросами к браузерам из курса Udemy, который я провел несколько месяцев назад. Тем не менее, отличий было более чем достаточно, чтобы найти новые задачи.

Например, одна вещь, которую мне было очень трудно понять, - это сеансы.

Что такое сеанс, спросите вы?

Ну, сеанс похож на хеш ... но не совсем. Это объект и коммуникатор в ответе сервера!

По сути, это работает так. Пользователь в своем веб-браузере делает запрос к серверу (скажем, что-то вроде входа в систему). Сервер генерирует ответ, который включает в себя сеанс, и отправляет эту новую информацию в сеансе обратно в браузер для сохранения на этом сайте cookie.

Основной частью данных, которые я хранил в своем приложении, было то, вошел ли пользователь в систему или нет. Это было достигнуто путем проверки наличия ключа в созданном мною объекте сеанса с именем session[:user_id] в файле cookie браузера на момент получения ответа. Если нет, то пользователь не должен входить в систему. Если был, то я бы установил session[:user_id] равным уникальному идентификатору пользователя, который генерируется при создании пользователя при регистрации.

get "/login" do
 if session[:user_id]
  erb :"/users/user_page"
 else
  erb :"users/login"
 end
end
post "/login" do
 user = User.find_by(username: params[:username])
  if user && user.authenticate(params[:password])
   session[:user_id] = user.id
   redirect "/users/home"
  else
   redirect "/login"
  end
end

Что такое слизняк?

Еще кое-что, что пришло мне в голову в ходе моих лабораторий, было идеей слизня.

Нет, это не то сумасшедшее существо наверху.

Представьте, что у вас есть веб-сайт, и вы создаете маршруты с помощью ActiveRecord, чтобы иметь уникальный идентификатор для каждого уникального элемента / типа записи. Если бы вы показывали конкретный элемент / запись, маршрут мог бы выглядеть примерно так:

get "/item/:id do 
 @item = Item.find_by(id: params[:item])
 erb :show
end

Это прекрасный и приемлемый путь до тех пор, пока вы не начнете видеть результат в URL-адресе.

localhost:9393/item/2

Это мало что говорит вам о вашем местонахождении, исходя из URL-адреса?

Представляем пули!

Слаг - это метод экземпляра, который вы помещаете в класс модели (в данном случае Item), который находит идентификатор нужного вам элемента и возвращает значение, равное имени элемента.

def slug
 self.name.downcase.gsub(" ", "-")
end

Затем вы можете найти элемент, используя метод класса, используя созданный вами метод экземпляра, чтобы вы могли использовать его для поиска на основе параметров вашего нового маршрута!

#passes in params[:slug] into the argument
 
def self.find_by_slug(slug)
  self.all.find { |muppet| muppet.slug == slug }
 end

Вот пример того, как выглядит маршрут из моего проекта Muppet.

#uses :slug instead of :id for labeling
get "/muppets/:slug" do

#helper method that redirects if the user is not logged in 
redirect_if_not_logged_in
#another helper method that checks if the user is logged in 
if in_session?
  @muppet = Muppet.find_by_slug(params[:slug])
  erb :"muppets/show_muppet"
 else
  redirect to "/login"
 end
end

Это изменяет URL-адрес на более читаемый.

#instead of localhost:9393/muppets/3, we get 
localhost:9393/muppets/kermit

Шоу должно продолжаться

В целом, этот этап курса был взрывным. Я никогда не думал, что интерес к куклам когда-нибудь пригодится в жизни, но теперь я знаю, что можно ожидать неожиданного!