Когда дело дошло до выбора моего проекта 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
Шоу должно продолжаться
В целом, этот этап курса был взрывным. Я никогда не думал, что интерес к куклам когда-нибудь пригодится в жизни, но теперь я знаю, что можно ожидать неожиданного!