Archive for the 'Ruby' Category

Problemy z asset pipeline pod Apache

Na wypadek, gdyby ktoś jeszcze miał mieć problemy z asset pipeline pod Apache, podzieliliśmy się rozwiązaniem na blogu: TrackingRails – Rails 3.1 and asset pipeline problems with apache

Jak postawić środowisko Rails na Amazonie?

Dziękujemy wszystkim uczestnikom czerwcowego Rupy Tuesday za udział w ostatnim tego typu spotkaniu w tym sezonie. Mieliśmy okazję dowiedzieć się m.in. jak postawić środowisko Rails na Amazonie (na EC2), przy użyciu narzędzia rubber.
Zapraszamy do zapoznania się z prezentacją Macieja Litwiniuka:

Poniżej zamieszczamy tutorial, pokazujący niezbędne działania “krok po kroku”:





Podczas wakacji zawieszone są spotkania RupyTuesday, ale mamy propozycję dla wytrwałych: 30.07-31.07 w naszym biurze obędzie się 48 godzinny maraton, podczas którego będziemy starali się wyklikać wspólnie działającą aplikację. Jeśli chcecie wziąć udział w tym wydarzeniu, napiszcie do nas.

Zapraszamy!

RailsRumble i eevmee.com

eevmee.comW weekend (16-17.X.2010) wzięliśmy udział w konkursie RailsRumble. Zadaniem było utworzenie w pełni funkcjonalnej aplikacji w RubyOnRails w 48h (16.X 0:00 GMT – 18.X 0:00 GMT). Dzięki Kubie, Leszkowi, Piotrowi i Tomkowi powstała aplikacja eevmee.com. eevmee ma za zadanie ułatwiać organizowanie spotkać i szeroko pojętych eventów (jak np. RuPy Tuesday organizowany przez nas :) ). Pomagamy zarządzać listą gości, śledzić, czy odebrali maila / obejrzeli stronę wydarzenia / zapisali się na wydarzenie, ekportować listę gości do formatu xls, ale również, jako jedyni na rynku – tworzyć własne formularze rejestracyjne. eevmee.com to również organizacja spotkań – jeśli zdarza Ci się organizować spotkania, na które znajomi mają coś kupić, na pewno zdarzyło się, że czegoś było za dużo, czegoś za mało. eevmee ma  temu zapobiec przez tworzenie listy zadań, które znajomi mogą brać na siebie – każdy będzie wiedział, co trzeba załatwić i wybrać rzecz najbardziej mu odpowiadającą.

devise i testy funkcjonalne

Właśnie spędziłem zdecydowanie za dużo czasu próbując dojść, czemu właściwie nie chcą mi przechodzić testy funkcjonalne dla kontrolerów wymagających autoryzacji. Problemem było devise, które jakby nie chciało tworzyć pseudo sesji i wszystko przestawało działać. Dopiero po dłuuuższej chwili walczenia przypomniało mi się, że model, który próbowałem autoryzować miał dodaną flagę :confirmable. W ramach rozwiązania wystarczyło do fixtures dodać dwie kolumny: confirmed_at i confirmation_sent_at (nawet nie jestem pewien, czy ta druga jest konieczna…). Poniżej przykład działający.

1
2
3
4
5
tas:
  username: tas
  email: tas@zrobimydobrze.com
  confirmed_at: <%= 1.days.ago.to_s :db %>
  confirmation_sent_at: <%= 2.days.ago.to_s :db %>

tinymce_filemanager w The Ruby Show!

W zasadzie to zapomnieliśmy się pochwalić, że w ostatnim odcinku (118) The Ruby Show Jason Seifer i Dan Benjamin rozmawiali o pluginie przygotowanym przez Leszka. Dziękujemy bardzo! :)

Rails, TinyMCE i zarządzanie obrazkami

Edycja stron statycznych i dowolne osadzanie w nich obrazków zawsze było swego rodzaju problemem – do edytora graficznego trzeba było dodawać różnego rodzaju sztuczne pluginy, które i tak nigdy nie działały w pełni poprawnie. Dlatego przygotowaliśmy plugin do Railsów, który powoduje, że zarządzanie plikami z poziomu edytora staje się banalne. Oto specjalnie dla Państwa TinyMCE FileManager. Instrukcja instalacji i przykładowe użycie już na GitHubie.

Przy okazji wielkie dzięki dla Leszka za kawał dobrej roboty.

Przyjazne URLe w Rails

Przyjazne URLe (w postaci: server.com/blog/123-tytul-bloga) w dowolnej aplikacji można w Railsach uzyskać bardzo łatwo. Cała pseudo-sztuczka opiera się na fakcie, że jeśli ID rekordu zaczyna się od cyfr, ActiveRecord wycina sobie tylko cyfry z początku ciągu znaków. Czyli wywołanie

1
@blog = Blog.find(123)

niczym się nie różni od

1
@blog = Blog.find("123-tu_jakis_tytul")

By uzyskać przyjazne URLe w aplikacji, do modelu należy dodać metodę to_param:

1
2
3
def to_param
  "#{id}-#{title.parameterize}"
end

Tak byłoby jednak za prosto – railsy nie radzą sobie z literami “ł” i “Ł”. Poniżej więc proste obejście tego (wrzucić do pliku config/initializers/active_support.rb):

1
2
3
4
5
6
7
8
9
10
11
module ActiveSupport
  module CoreExtensions
    module String
      module Inflections
        def parameterize(sep = '-')
          Inflector.parameterize(self.gsub("ł", "l").gsub("Ł", "L"), sep)
        end
      end
    end
  end
end

Import kontaktów z kont pocztowych

Ostatnio na specjalne życzenie klienta przygotowaliśmy bibliotekę importującą kontakty z książek adresowych darmowych kont pocztowych najpopularniejszych polskich portali (Interia.pl, Wirtualna Polska, O2.pl, Gazeta.pl i Gmail.com). Brakuje jeszcze tylko Onetu, ale mam nadzieję, że i to uda się wkrótce obejść.

Biblioteka napisana jest w Ruby, rzuca wyjątkami, itd, ale przynajmniej działa. Jej głównym zadaniem jest taki import znajomych, by dało się przedstawić ich listę użytkownikowi, by ten mógł zaprosić swoich znajomych do serwisu.

Uwaga – biblioteka wymaga nokogiri, mechanize i fastercv.

Do pobrania z Githuba, na razie trzeba klonować. Gdy uda się zaciągnąć kontakty z Onetu, pewnie Gem powstanie.

http://github.com/galdomedia/addr_book_importer_pl/tree/master

Uwaga: nie wiem na ile wykorzystywanie tej biblioteki jest zgodne z regulaminami portali, z których kontakty są importowane. Dostarczamy narzędzie, ale nie odpowiadamy za wszelkie skutki jego stosowania!

zaawansowane formy w Rails i błąd 500

Ostatni update Railsów do wersji 2.1.2 (z 2.1.0 bodajże) spowodował, że pewien fragment pisanego systemu przestał działać – konkretnie stało się coś z wysyłaniem zagnieżdżonych form. Forma zamiast się kulturalnie wysłać i zapisać, bądź mniej kulturalnie wysłać się i rzucić pięknym, czytelnym błędem, ta zaczęła ordynarnie rzucać statusem 500 Internal Server Error (“nie pogadasz”). Wprowadziło nas to w lekką konsternację, bo nie często się zdarza, by aplikacja Rails w trybie development aż tak brzydko się zachowywała. Jedyną rzeczą, która była w stanie naprowadzić nas na przyczynę, był ostatni komunikat w konsoli:

Conflicting types for parameter containers. Expected an instance of Hash but found an instance of Array. This can be caused by colliding Array and Hash parameters like qs[]=value&qs[key]=value. (The parameters received were [{"sex"=>"M", "first_name"=>"Maciej", "last_name"=>"Litwiniuk"}].)

Zatem coś z parametrami. Nie udało się tego jednak łatwo zdebugować – aplikacja po prostu rozkładała się na łopatki, zanim zdążyła poprawnie wstać. Googlanie jednak pozwoliło znaleźć rozwiązanie, raczej banalne w swej prostocie – błąd powodowało pole date_select, które nagle zaczęło się błędnie renderować w zagnieżdżonych formach – nie dodawało znacznika tablicy ([]), co skutkowało właśnie wyjątkiem krytycznym – Railsy faktycznie w parametrach dostawały mieszaninę Hasha i tablicy.

Rada? Dodać parametr :index=>'' do wywołania date_select, które wymusza wstawienie indeksu w nazwie pola. Jego pusta wartość (NIE nil) powoduje, że pole zostanie wygenerowane poprawnie.

Przykład:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<% fields_for "subscription[member_attributes][]", member do |m| %>
  <td><%= m.select(:sex, {'Meżczyzna'=>'M', 'Kobieta'=>'K'}) %></td>
  <td><%= m.text_field :first_name %></td>
  <td><%= m.text_field :last_name %></td>
  <td width="50">
  	<%= m.date_select :birthdate, 
				:start_year => 1900, 
				:use_month_numbers => true, 
				:order => [:day, :month, :year], 
				:end_year=>Time.now.year, 
				:default=>{:year=>1990}, 
				:class=>"dateselect",
				:index=>'' %> 
	<%= link_to_function image_tag("icon_delete.gif", {:border=>0}), "$(this).parent('td').parent('tr').remove();prices_for_participants();" %></td>
  </td>

Rails – pluginy obowiązkowe

Ostatnio ponownie przyszło nam pisać trochę w RubyOnRails. Wpierw udało się wypuścić Giełdę Ziemi, teraz przygotowujemy serwis dla biura turystycznego. Dodając do tego wszelkie projekty i projekciki tworzone po godzinach, zasadniczo przygotowaliśmy sobie listę pluginów, które zawsze stosujemy. A na blogu lądują przede wszystkim dla nas ku pamięci. Aczkolwiek będzie nam niezmiernie miło, jeśli komuś się przyda.

  1. Restful Authentication – sztandarowy wręcz plugin w znaczny sposób zwalniający nas z robienia czegokolwiek z autoryzacją użytkownika. Plugin się instaluje, dodaje 3-4 linie kodu i voila.
    strona pluginu i screencast
  2. acts_as_state_machine – wykorzystywany przez restful auth – dzięki niemu konta użytkowników mogą mieć przypisane dodatkowe stany, np: oczekujące, aktywne, zawieszone, itp. Sam plugin imituje bardzo prostą maszynę stanu.
    strona pluginu
  3. jRails – przydatna rzecz dla wszystkich, którzy preferują jQuery, a nie prototype, od którego Railsy są w pewnym stopniu zależne. Plugin dostarcza jQuery, jQuery UI oraz własną bibliotekę, która podpina się grzecznie pod różnego rodzaju skrótowe funkcje znane z Railsów (np. link_to_remote, visual_effect, etc) i generuje odpowiednik za pomocą jQuery.
    strona pluginu
  4. simple captcha – zrzuca z nas ciężar ręcznego generowania obrazków captcha. Wystarczająco konfigurowalne dla półprofesjonalnych zastosowań (jako, że moim skromnym zdaniem jest dość proste do złamania, ale zbyt trudne dla prostych spam-botów).
    strona pluginu
  5. paperclip – rewelacyjnie wręcz upraszcza uploadowanie plików oraz generowanie miniatur z wrzucanych do serwisu zdjęć. attachment_fu traci przy nim cały swój urok.
    strona pluginu i dodatkowa instrukcja
  6. human_attribute_overwrite – pozwala nadpisać nazwy atrybutów – “message” z modelu możemy w łatwy sposób przetłumaczyć do “wiadomość”, która pojawi się np. przy automatycznym wyrzucaniu błędów.
    strona pluginu i dodatkowa instrukcja
Lista może i krótka, ale pluginy powyższe zdecydowanie ułatwiają życie. Jak to podsumował Tomek, z samych powyższych pluginów można przygotować prosty portal społecznościowy nastawiony na upload obrazków :).