grudzień 7.12

Spotykamy się jak zwykle o 19!

Przepraszam, ale tym razem ja odpadam. Jutro, najpóźniej w piątek, muszę złożyć pracę dyplomową, a muszę jeszcze nad nią trochę popracować (oraz odespać manko).

Szkoda. Info dla wszystkich: Wrug must go on!

Dzięki organizatorom za organizacje, a współuczestnikom za współuczestniczenie. I dzięki za wprowadzenie na Djangopiwko które też niczego sobię ;]

Pozdrawiam

Prezentacja Piotrka: http://vimeo.com/33959660

Lightning Talk: opis zmian w Rubym 1.9.3 http://vimeo.com/34117081 (najciekawsze są chyba komentarze Shota i Drogusa)

Jest gdzies dostepny kod z prezentacji drogusa ?

Tutaj: https://github.com/drogus/blog-api-example

@drogus

A wrzuciles gdzies moze same slajdy? Tez bylyby przydatne

Moglbys sie moze tez podzielic jakimis ciekawymi linkami na temat tworzenia i testowania API?

@drogus

Jak w najładniejszy sposób dodać linki do zwracanych poprzez API danych.

Na przykład mam komentarz, który należy do jakiegos posta i chce aby ten komentarz zwracał też url do tego posta, do którego przynależy

Właśnie coś takiego ostatnio dodawałem :wink:

Możliwości są dwie.

  1. Rozszerzasz presentery tak, żeby miały dostęp do helperów i tym samym url helperów, mniej więcej coś takiego jak tutaj:

http://going-beyond-mvc-moscow.heroku.com/#83

Wystarczy wtedy jako drugi argument podać view_context, czyli np. w controllerze:

PostPresenter.new(post, view_context)

Żeby było prościej to zbudować w kontrolerze, to możesz zrobić taki helper:

http://going-beyond-mvc-moscow.heroku.com/#89

I używać mniej więcej tak:

http://going-beyond-mvc-moscow.heroku.com/#90

Domyślnie ten helper próbuje zgadnąć jaka powinna być klasa presentera, którego chcesz użyć, ale można podać jako drugi argument klasę jaką chcemy opakować obiekt.

  1. Dodać do Presentera obsługę url helperów:

[code]class Api::Presenter < SimpleDelegator

include Api::Engine.routes.url_helpers

class << self
delegate :default_url_options, :to => “ActionController::Base”
end
end[/code]
Przy czym wtedy trzeba na sztywno ustawić default_url_options[:host], dla ActionController::Base, bo przy takim ustawieniu nie ma w presenterach dostępu do danych z requestu. Ja chyba wolę pierwsze rozwiązanie, ale szczerze mówiąc długo się nad tym nie zastanawiałem, więc mogłem coś przeoczyć.

Dzięki :slight_smile:

Jednym z plusów używania enginów do pisania API jest łatwość wersjonowania. Tworzę sobie nowy engine dla nowej wersji, podpinam go w innym punkcie montowania i wszystko śmiga.

Zastanawiam się nad faktem, co jeśli ze zmianą wersji API zmienia się też sposób tworzenia obiektów. Na przykład są używane inne walidacje i callbacki przy tworzeniu obiektu. Nie chce tych walidacji i callbacków wrzucać do modelu w aplikacji, po to aby wszystkie zmiany mogły się zawierać w zmianie samego API. Pytanie gdzie, jak i dlaczego miałbym je wrzucić.

Dobre pytanie. Można by zrobić model, który dziedziczy z Twojego głównego modelu, ale jest namespace’owany, np:

[code]class Api::Post < ::Post

własne walidacje

end[/code]
Tylko wtedy nie wiem do końca jak prosto usunąć już istniejące walidacje. Może wtedy warto by Post rozbić też na 2 modele - jakiś nadrzędny, który będzie wspólny i 2 dodatkowe klasy, jedną dla api i jedną dla aplikacji, gdzie będą różnice.

Na razie tyle mi przyszło do głowy, ale jak coś wymyślę, to dam znać :slight_smile:

Dzięki za odpowiedz. Moje myśli właśnie zmierzają w podobnym kierunku i potrzebował potwierdzenia ze strony autorytetu :slight_smile:

Kiedyś w spree jakoś walczyłem z usuwaniem dziedziczonej z klasy nadrzędnej walidacji i jakoś da się to zrobić.

Jakbyś jeszcze miał jakieś przemyślenia w tym temacie, chętnie się z nimi zapoznam :slight_smile:

Jak się teraz jeszcze nad tym zastanowiłem, to pozostaje jeszcze problem bazy danych. Jeżeli coś jest validowane np. w starej wersji API, a w nowej już nie, to w starej wersji będzie trzeba mieć do czynienia z rekordami, które nie mają jakichś wymaganych pól i może wystąpić problem z edycją. Masz jakiś konkretny przykład takiej zmiany?

Sprawa wygląda tak, że do wyszukiwania miejsc używamy google places api. I wymagamy podawanie google place id do ich identyfikacji i na podstawie tego wyszukujemy/tworzymy rekord miejsca u nas w bazie, gdzie przechowywujemy specyficzne dla nas info o miejscu.

Jak już zarobimy miliony, będziemy pewnie chcieli przestać korzystać z google places i to wszystko wziąć na siebie. Wtedy już od akcji związanych z miejscami nie będziemy wymagać google place id tylko własnego i po drodze nie będziemy musieli wyszukiwać/tworzyć rekordu dodatkowych info o miejscu. Czyli będziemy wymagać podania innych atrybutów i obecne callbacki przed validacyjne nie będą potrzebne.