Size: a a a

2021 January 21

D

Denis in RubyRush
Dmitry Agapov
Всем привет! Прохожу курс rubyrush, урок - Работа с сетью, прогноз погоды.
Решил дернуть апишку яндекс погоды и нужно передать api ключ. Читаю документацию к NET::HTTP и что-то трудно заходит. Ответ 403-я Forbidden. Понимаю что скорее всего я криво передаю и вообще не факт что передаю ключ.
Могли бы вы дать пару наводящих советов?
Так ошибка ясно говорит что не так :-)
источник

DA

Dmitry Agapov in RubyRush
угу)
источник

E

Eugene in RubyRush
Kill Real
да пока решил полигон использовать удобная френдли конструкция, в общем за ночь разобрался. нужно обязательно геометрическим данным для postgis в запросах указывать SRID ( я так понимаю это параметр отправной точки для расчетов координат). Документация конечно для гема RGeo и вытекающий ну мягко говоря "не очень".

Чтобы спасти некоторым жизнь, и уделить больше времени на близких вам людей и впечатления в жизни, вот запрос:

class RoutePoint < ApplicationRecord
 belongs_to :order

 def self.g_within_polygon
   # polygon = Geo.polygon(points)
   polygon = User.last.work_area
   self.where("ST_Contains(:polygon, ST_SetSRID(ST_MakePoint(longitude, latitude), #{Geo::SRID}))", polygon: Geo.to_wkt(polygon))
 end

 # points = [
 #   [-84.39731626974567, 33.75570358345219],
 #   [-84.33139830099567, 33.86524376001825],
 #   [-84.25243406759724, 33.770545357734925],
 #   [-84.39731626974567, 33.75570358345219]
 # ]

 # coords = Geo.pairs_to_points(points)

 # User.last.update(work_area: Geo.polygon(coords))
end


Geo это класс, который я взял в статье у человека,  ссылка:
https://pganalyze.com/blog/postgis-rails-geocoder#installing-postgis

Кстати засунул я этот класс в папку config/initializers, может вы как думаете стоит в другое место вынести его?

Из postgis использую функцию ST_Contains для ограничения области поиска, но также есть функция ST_Covers, советую изучить и ту и ту.

Вот результат выполнения в консоли:

RoutePoint.g_within_polygon.first
 User Load (0.3ms)  SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT $1  [["LIMIT", 1]]
 RoutePoint Load (0.6ms)  SELECT "route_points".* FROM "route_points" WHERE (ST_Contains('srid=4326;POLYGON ((-84.39731626974567 33.75570358345219, -84.33139830099567 33.86524376001825, -84.25243406759724 33.770545357734925, -84.39731626974567 33.75570358345219))', ST_SetSRID(ST_MakePoint(longitude, latitude), 4326))) ORDER BY "route_points"."id" ASC LIMIT $1  [["LIMIT", 1]]
=> #<RoutePoint:0x00007ff8950f1d20
id: 31,
address_title: "1798 Haygood Dr NE, Atlanta, GA 30307, США",
longitude: -84.3167664,
latitude: 33.7936176,
order_id: 39,
created_at: Wed, 20 Jan 2021 23:55:38 UTC +00:00,
updated_at: Wed, 20 Jan 2021 23:55:38 UTC +00:00>
в app/models вполне можно положить

в initializers точно не комильфо
источник

K

Kirill Ilyin in RubyRush
Всем плевать, кто вы там по скиллам. Если справились с ТЗ, значит с вами не будут никаких проблем на работе, по их мнению.
источник

DA

Dmitry Agapov in RubyRush
Integrity
Попробуй так
Спасибо, ответ получил. Добавил ещё :use_ssl => true. А то упала ошибка Connection reset by peer (Errno::ECONNRESET)
Вот что вышло:

require 'json'
require 'net/http'
require 'uri'

# создаем объект-адрес где лежит погода
uri
= URI("https://api.weather.yandex.ru/v2/forecast?lat=55.75396&lon=37.620393&extra=true")
request = Net::HTTP::Get.new(uri)
request['X-Yandex-API-Key'] = '894b5d69-51bf-41d8-a2a3-xxx'

response = Net::HTTP.start(uri.host, uri.port, :use_ssl => true) do |http|
 
http.request(request)
end

puts
response.body
источник

I

Integrity in RubyRush
Dmitry Agapov
Спасибо, ответ получил. Добавил ещё :use_ssl => true. А то упала ошибка Connection reset by peer (Errno::ECONNRESET)
Вот что вышло:

require 'json'
require 'net/http'
require 'uri'

# создаем объект-адрес где лежит погода
uri
= URI("https://api.weather.yandex.ru/v2/forecast?lat=55.75396&lon=37.620393&extra=true")
request = Net::HTTP::Get.new(uri)
request['X-Yandex-API-Key'] = '894b5d69-51bf-41d8-a2a3-xxx'

response = Net::HTTP.start(uri.host, uri.port, :use_ssl => true) do |http|
 
http.request(request)
end

puts
response.body
все на самом деле просто, это была первая страница в гугле)
источник

KR

Kill Real in RubyRush
Eugene
в app/models вполне можно положить

в initializers точно не комильфо
Т.е. лучше в модели без таблицы закинуть, просто тогда других разработчиков это может сбить с толку субьективно, представь что ты у меня клонируешь реп, там модель, пытаешься в консоли вызвать данные как объекты актив рекорд, а их нет ( я просто тоже думал над моделями ) и у меня возник такой вопрос к себе. И иниты тоже выглядет сомнительно, думал над сервисами, но они что делают какую то мини фичу, по факту вроде подходит. Охото чтоб было прям круто для всех, воть и парюсь как лучше ((
источник

E

Eugene in RubyRush
Kill Real
Т.е. лучше в модели без таблицы закинуть, просто тогда других разработчиков это может сбить с толку субьективно, представь что ты у меня клонируешь реп, там модель, пытаешься в консоли вызвать данные как объекты актив рекорд, а их нет ( я просто тоже думал над моделями ) и у меня возник такой вопрос к себе. И иниты тоже выглядет сомнительно, думал над сервисами, но они что делают какую то мини фичу, по факту вроде подходит. Охото чтоб было прям круто для всех, воть и парюсь как лучше ((
В моделях без таблиц нет ничего неконвенционального
источник

E

Eugene in RubyRush
нормальная тема
источник

E

Eugene in RubyRush
Именно там такой класс и ожидаешь найти. Сервисы, как вы сами верно заметили, это не "данные", а "действия".
источник

E

Eugene in RubyRush
Есть общие свалки всего подряд - это lib/ или вот, предлагают последнее время, app/lib
источник

KR

Kill Real in RubyRush
Eugene
Есть общие свалки всего подряд - это lib/ или вот, предлагают последнее время, app/lib
Да замечал такое, и у меня стереотипно что это стороннее/вендорное что то, как будто снаружи, а не внутри и поэтому как то не расматривал, ну да ещё раз «вслух» проговорю эти моменты с моделями и либами, чтобы понять как лучше читается для понимания/восприятия
источник

KR

Kill Real in RubyRush
Спасибочки 🙏
источник

E

Eugene in RubyRush
Kill Real
Да замечал такое, и у меня стереотипно что это стороннее/вендорное что то, как будто снаружи, а не внутри и поэтому как то не расматривал, ну да ещё раз «вслух» проговорю эти моменты с моделями и либами, чтобы понять как лучше читается для понимания/восприятия
источник

KR

Kill Real in RubyRush
Ну да, все логично, спасибо за поддержку мужик ☺️🚀😉
источник
2021 January 22

V

Valery in RubyRush
Integrity
то есть вывод будет

будет  и в
hello
и в
hello1
class Dog
 def hello1(a)
   puts yield.downcase
   puts a
 end

 def hello(a, &block)
   puts yield.downcase  # или puts block.call.downcase
   puts a
   hello1(a, &block)
 end
end

Dog.new.hello('check') { 'BLOCK TEXT' }
источник

I

Integrity in RubyRush
Valery
class Dog
 def hello1(a)
   puts yield.downcase
   puts a
 end

 def hello(a, &block)
   puts yield.downcase  # или puts block.call.downcase
   puts a
   hello1(a, &block)
 end
end

Dog.new.hello('check') { 'BLOCK TEXT' }
Хотел узнать  можно ли так сделать с неявной передачей аргументов но спасибо за отклик и помощь
источник

V

Valery in RubyRush
Integrity
Хотел узнать  можно ли так сделать с неявной передачей аргументов но спасибо за отклик и помощь
Если неявно, то я могу придумать только через наследование:
class Wolf
 def hello(a)
   puts yield.downcase
   puts a
 end
end

class Dog < Wolf
 def hello(a)
   puts yield.downcase
   puts a
   super
 end
end

Dog.new.hello('check') { 'BLOCK TEXT' }
источник

I

Integrity in RubyRush
Valery
Если неявно, то я могу придумать только через наследование:
class Wolf
 def hello(a)
   puts yield.downcase
   puts a
 end
end

class Dog < Wolf
 def hello(a)
   puts yield.downcase
   puts a
   super
 end
end

Dog.new.hello('check') { 'BLOCK TEXT' }
это да, но хотел без наследования)
источник

V

Valery in RubyRush
Integrity
это да, но хотел без наследования)
Ну, ещё можно попробовать за-prepend-ить или за-include-ить модуль и тоже использовать `super`для вызова.
источник