Rails - 10 Przykazań

Na forum [color=red]brak życia[/color], więc propozycja na rozruszanie dyskusji: najważniejsze strategiczne zalecenia przy tworzeniu nowej aplikacji w Ruby on Rails:

Nauka

  • Nie stosuj podejścia “nauka w walce”
  • Kup książkę - dokumentacja i tutoriale nie wystarczą

Środowisko

  • Programuj pod dowolnym systemem
  • Wdrażaj tylko na systemy uniksopochodne
  • Jeśli masz wybór, wybierz MySQL lub PostgreSQL

Schemat danych

  • Traktuj tabele rozwiązujące wiele-do-wielu jak prawdziwe encje
  • Zapomnij o kluczach złożonych
  • Zapomnij o kluczach naturalnych
  • Używaj kluczy obcych (mimo, że DHH ich nie używa)

Logika biznesowa

  • Logikę biznesową umieszczaj tylko w katalogach app/models i lib
  • Waliduj wejście w modelach

Kontroler i widoki

  • Pisz w duchu REST: myśl w kategoriach operacji CRUD na zasobach (RESTful Resources)
  • Postaw model za każdym formularzem
  • Używaj helperów do generacji wewnętrznych URL-i
  • Nie trzymaj obiektów w sesji

Inne

  • Używaj wyłącznie anglojęzycznych identyfikatorów

Rozwinięcie i uzasadnienie wszystkich punktów prezentuję w artykule “Rails: 10 przykazań”.

Początkujących zachęcam do poszerzenia wiedzy.
Zaawansowanych do podzielenia się własnym doświadczeniem, weryfikacji i komentarzy.

Do dzieła, Panowie (i Panie?) :slight_smile:

Dodałbym jeszcze
do widoku:

  • staraj się czynić szablony tak proste (w sensie zawierania w nich kodu) jak to tylko możliwe

i chyba najważniejsze

  • naucz się kiedy trzeba podane zasady łamać

[quote=daniel]do widoku:

  • staraj się czynić szablony tak proste (w sensie zawierania w nich kodu) jak to tylko możliwe
    i chyba najważniejsze
  • naucz się kiedy trzeba podane zasady łamać[/quote]
    Dobre, obiecuję dodać w najbliższej rewizji 10-ciu przykazań.

Fajny blog, ciekawe arty. Tak dalej!

To co teraz powiem może nie mieć sensu i nie biorę za to odpowiedzialności :wink:

Mam kontroler “fanarea” i model “user”

w routes.rb mam
map.resources :user

Czy można zrobić tak, żeby to działało “w kontrolerze” fanarea?
Na przykład generując sobie link helperem user_url dostawałbym “/fanarea/user/” a nie, tak jak teraz, “user/”

Być może tymi zdaniami zaprzeczyłem całemu sensowi istnienia REST, railsów i wogóle świata, dlatego proszę o wyrozumiałość :stuck_out_tongue_winking_eye:

EDIT:
Ok, doszedłem do wniosku, że lepiej stworzyć sobie kontroler User i nie komplikować życia :>

Co do RESTful Rails: czy dobrze sądzę, że jest to po prostu railsowy sposób imitacji żądań przeglądarki? Czy to ma jakieś podstawy swojego istnienia, tzn czy np. w przyszłości będą takie żądania przez sam protokół rozpoznawane i nie trzeba będzie przesyłać na przykład ukrytego pola w formularzu?
Mało jest artykułów na temat REST, nawet w języku angielskim, na blogach też jakoś ludzie nie podejmują tematu (nie licząc wpisów typu “mam restful i jest mi z tym dobrze” :P) więc ciężko znaleźć sensowne wytłumaczenie (ja korzystałem z rest cheat sheet)

Chcesz po prostu mieć URL-a zaczynającego się od fanarea? Żaden problem. Kontrolery powinny zostać jak są, wystarczy skonfigurować routing:

map.resources :user, :path_prefix => '/fanarea'

Zapewniam, że nie zrobiłeś nic złego :wink:

REST to zbiór ograniczeń, które mają ogromny wpływ na sposób modelowania i jednolitość aplikacji.

Idea polega na tym, że masz tylko 4 czasowniki: GET POST PUT DELETE i dowolną liczbę rzeczowników (definiowanych przez Ciebie - User, Article, Post, Membership, Closure, Book, Event, Group, …). Rzeczowniki to zasoby, którymi użytkownicy mogą zarządzać.

Aplikacja to po prostu zbiór zasobów.

Np. nie istnieje coś takiego jak “addToGroup” (ani URL, ani metoda w kontrolerze), bo nie dysponujemy czasownikiem “add”. W filozofii REST byłoby to “POST Membership”, czyli utworzenie nowego bytu “Membership”.

Dodam od siebie:

Wyrzucaj wszystkie dane wklepane przez użytkowników przez helpery.

Owiecc: dobre, dzięki! Przy okazji przypomniało mi się też zalecenie z bezpiecznym budowaniem kawałków SQL-a. Dorzucę wszystko w najbliższej rewizji.

[quote=owiecc]Dodam od siebie:

Wyrzucaj wszystkie dane wklepane przez użytkowników przez helpery.[/quote]
Będę wdzięczny, jeśli to rozwiniesz. Może prosty przykład?

<%=h potencjalnie_wstrzykniety_kod %>

Chodzi o coś takiego (przykład)

<%= h User.login %>

lub

<%= textilize User.login %>

Aha, to owiecc miał na myśli. Dzięki :slight_smile:

Ciekawe od czego h jest skrótem…

h może być skrótem od hide żeby tenże kod html ukryć

h() jest aliasem do html_escape() http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/classes/ERB/Util.html