FAQ
Pytania można kierować do mnie mailem!
- Jak zapobiegać zapisywaniu hasła w logu aplikacji?
Należy włączyć filtrowanie parametrów w kontrolerze odbierającym dane z formularza logowania. Jeśli korzystamy z acts_as_authenticated, to domyślnie jest to AccountController. Zakładamy, że hasło przesyłane jest w params pod kluczem :password. Dodajemy linijkę:
Od tej pory hasło w logu aplikacji będzie filtrowane:filter_parameter_logging :passwordParameters: {"commit"=>"Log in", "action"=>"login", "controller"=>"account", "login"=>"admin", "password"=>"[FILTERED]"} - Jak radzić sobie z kodowaniem znaków? Należy zwrócić uwagę na to, w jakim kodowaniu przechowujemy dane w bazie oraz wyświetlamy w widoku.
- definiujemy kodowanie poszczególnych tabel. W migracjach możemy przekazać kodowanie jako parametr dla funkcji create_table, np.
Aby sprawdzić kodowanie istniejących tabel, można skorzystać z polecenia:create_table( :families, :options => 'DEFAULT CHARSET=UTF8' ) do |t| ... endSHOW CREATE TABLE nazwa_tabeli; - definiujemy kodowanie dla połączenia z bazą danych. W pliku database.yml w sekcjach development i production dodajemy parametr encoding, np.
encoding: utf8 - definiujemy content-type danych wysyłanych do przeglądarki. W ApplicationController dodajemy:
after_filter :set_charset def set_charset content_type = @headers["Content-Type"] || 'text/html' if /^text\//.match(content_type) @headers["Content-Type"] = "#{content_type}; charset=utf-8" end end - definiujemy content-type w layoucie.
<meta http-equiv="content-type" content="text/html;charset=utf-8" /> - Jak poradzić sobie z kodowaniem polskich znaków w żądaniach AJAXowych?
Dane przesyłane AJAXem za pomocą biblioteki Prototype są kodowane w utf8. Musimy je przekonwertować do latin2, skorzystamy z biblioteki Iconv. W controllers/application.rb dodajemy definicję metody konwertującej:
require 'iconv' class ApplicationController < ActionController::Base [...] def utf2iso(str) Iconv.new('iso-8859-2', 'utf-8').iconv(str) end endNastępnie w każdej akcji odbierającej dane z formularzy AJAXowych zmieniamy kodowanie, na przykład:
def create_comment if request.xhr? params[:comment][:body]=utf2iso(params[:comment][:body]) params[:comment][:author]=utf2iso(params[:comment][:author]) end @comment = Comment.new(params[:comment]) [...] endSprawdzamy, czy mamy do czynienia z żądaniem AJAXowym jeśli spodziewamy się, że dana akcja może być wywoływana również poprzez zwykłe żądanie.
A w ogóle to stosujemy utf8 :)
- Jak poradzić sobie z kodowaniem polskich znaków w plikach .rhtml?
Aby strony wyświetlały się prawidłowo musimy ustawić odpowiedni content type w nagłówku strony oraz zadbać o to, aby pliki .rhtml były faktycznie zapisane w odpowiednim kodowaniu.
Przykładowo, przy korzystaniu z iso-8859-2 ustawiamy w pliku layoutu aplikacji:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
oraz wszystkie pliki .rhtml zapisujemy w kodowaniu iso-8859-2. Przydaje się do tego edytor pozwalający na wybór strony kodowej przy zapisie i odczycie plików, dla Windows jest to np. FOX Edit a dla Linuxa Text. - Jak poradzić sobie z kodowaniem polskich znaków w plikach .rhtml w Aptanie?
- Okna -> Preferencje -> Ogólne -> Obszar roboczy -> Kodowanie pliku tekstowego: jeśli nie ma na liście iso-8859-2, to wpisać taką pozycję, zastosuj
- Okna -> Preferencje -> Ogólne -> Typy treści: dla wybranego typu plików ustawiamy domyślne kodowanie na iso-8859-2
- Pojawia się błąd: #HY000Illegal mix of collections ...
Jest to spowodowane niezgodnością domyślnego kodowania mysql i railsów.
UWAGA Przed przejściem do dalszych instukcji proszę sprawdzić, czy sytuacji nie rozwiązuje proste ustawienie
encoding: latin2w sekcji "development" pliku config/database.yml, poniższy filtr wywoływany przed każdą akcją jest bardzo kosztowny.Można sobie z tym poradzić dodając następujący fragment do głównego kontrolera (app/controllers/application.rb):
before_filter :configure_charsets #will run the method 'configure_charsets' before every action def configure_charsets # Set connection charset. MySQL 4.0 doesn't support this so it # will throw an error, MySQL 4.1 needs this suppress(ActiveRecord::StatementInvalid) do ActiveRecord::Base.connection.execute 'SET NAMES latin2' end end - Jak zainstalować gem na wierzbie bez uprawnień administratora?
Użytkownik może instalować poszczególne gemy w katalogu domowym. Instrukcja:- utworzyć katalog, w którym będą instalowane gemy. Najlepiej o nazwie "gems" bezpośrednio w katalogu domowym:
cd mkdir gems - utworzyć ukryty plik o nazwie ".gemrc" w katalogu domowym
- dodać do .gemrc wpisy informujące o ścieżce do gemów (należy zamienić login na swój login):
gemhome: /home/epi/login/gems gempath: - /home/epi/login/gems - /usr/lib/ruby/gems/1.8 - sprawdzić, czy ustawienia zostały zaktualizowane:
gem environment - można już instalować gemy, na przykład:
gem install RubyInline
- utworzyć katalog, w którym będą instalowane gemy. Najlepiej o nazwie "gems" bezpośrednio w katalogu domowym:
- Jak przetłumaczyć komunikaty błędów walidacji na język polski?
Może w tym pomóc plugin Localization Simplified, pod warunkiem, że przetłumaczymy odpowiednie komunikaty (obecnie nie ma wersji dla języka polskiego).
UWAGA! Pan Michał Kozak przygotował polską wersję komunikatów dla localization_simplified, proszę korzystać i zgłaszać błędy / sugestie poprawek.
Ten plugin sam ustawia kodowania stron na utf8, o czym należy pamiętać i nie mieszać z iso-8859-2.
- Jak przeglądać log Apache na wierzbie?
Log bledow apache znajduje sie w pliku /usr/local/apache2/logs/error_log. Jest to duzy plik i trudno go przegladac w calosci. Jeśli potrzebujemy obejrzeć tylko jego końcówkę, aby zaraz po wystąpieniu błędu zobaczyć jego opis, najlepiej posłużyć się poleceniem tail:
tail -200 /usr/local/apache2/logs/error_log | grep logi
Parametr liczbowy oznacza liczbę linii do wyświetlenia, login to nasz login na wierzbie.
Jeśli natomiast faktycznie potrzebujemy przeglądnąć większą część logu, pomocne są polecenia more/less.
- Jak przeglądać log aplikacji?
Logi aplikacji znajdują się w katalogu log. W zależności od środowiska w jakim działamy (development, production, test), zapisywany jest plik o odpowiadającej nazwie z rozszerzeniem .log. Jest to duży plik, więc przy jego przeglądaniu stosujemy odpowiednie narzędzia.
W "Jak przeglądać log Apache na wierzbie?" opisano techniki przydatne w środowisku linii poleceń. Natomiast kiedy pracujemy w środowisku RadRails/Aptana/Eclipse z pluginem do railsow, wygodnie jest korzystać z opcji ciągłego przewijania końcówki logu w okienku konsoli (dolny panel). W drzewku plików projektu (lewy panel) klikamy prawym przyciskiem myszy na interesujący nas plik logu, na ogół development.log, a następnie z menu kontekstowego wybieramy opcję 'tail'. Jeśli w dolnym panelu sama nie otworzy się konsola z logiem, trzeba ją otworzyć ręcznie korzystając z głównego menu (Show View -> Console).
Proszę pamiętać, że w tym logu można zobaczyć wszystkie przesyłane z przeglądarki parametry jak i zapytania sql. Zamiast więc zastanawiać się "czemu x przyszło puste?" lub "czemu źle się wyszukało?" -- po prostu należy sprawdzić to w logu.
- Przeglądarka zwraca błąd podobny do: "Nieprawidłowe przekierowanie; serwer przekierowuje żądanie tego zasobu w sposób
uniemożliwiający jego ukończenie"
Jest to najczęściej spowodowane nieskończoną pętlą przekierowań. Łatwo o taką sytuację na przykład wtedy, gdy zabezpieczymy wszystkie akcje przed nieautoryzowanym dostępem za pomocą before_filter, przy czym zapomnimy uczynić wyjątek dla akcji realizującej autoryzację (skip_before_filter).
- Jak używać Google Maps z pluginu ym4r na wierzbie?
- wygenerować klucz dla domeny wierzba.wzks.uj.edu.pl na stronie GMaps API signup.
- przeedytować plik config/gmaps_api_key.yml dodając do niego nowy klucz w sekcji development. Przykładowo sekcja "development" może wyglądać następująco:
development: localhost:3000: ABQIAAAAzMUFFnT9uH0xq39J0Y4kbhTJQa0g3IQ9GZqIMmInSLzwtGDKaBR6j135zrztfTGVOm2QlWnkaidDIQ wierzba.wzks.uj.edu.pl: ABQIAAAAInpXQ2R5uXQ2NULlLwTVkxRD_LepbJJEs13wjJQMvqJmflEIKxT_PDMjU0dnJb15E-gSSbGSXpTm7g - przeedytować plik(i), w których wywołujemy metodę GMap.header (layouty) dodając do jej wywołania parametr:
GMap.header(:host => @request.host) - przeedytować plik config/environment.rb, dodając na początku (najlepiej okoloce linii 5) ustawienie zmiennej oznaczającej środowisko uruchamiania:
ENV['RAILS_ENV'] = 'development' - gdyby nie ładowały się javascripty z pluginu (np. błąd addCodeToFunction is not defined), należy je przekopiować z katalogu vendor/plugins/ym4r_gm/javascript do public/javascripts, a w pliku/ach, w których wywołujemy metodę GMap.header (layouty) poprzedzić ją załadowaniem pliku ym4r-gm.js, np. tak:
<% if @map %> <%= javascript_include_tag 'ym4r-gm' %> <%= GMap.header(:host => @request.host, :with_vml => false) %> <%= @map.to_html %> <% end %>
- Jak szukać przyczyn błędu "Application Error"?
Ten błąd może być wywołany przez różne czynniki. Najpierw należy wyeliminować najczęstsze:
- "puts" w plikach źródłowych -- Apache nie toleruje wypisywania na konsolę w kodzie programu, więc jeśli korzystaliśmy z wyrażeń "puts" do debugowania uruchamiając na webricku, musimy je usunąć przed uruchomieniem na Apache
- prawa dostępu do katalogów log i tmp -- muszą być ustawione rekursywnie (chmod -R a+w log; chmod -R a+w tmp)
- prawa dostępu do pliku public/dispatch.cgi -- musi być execute dla Apache, najprościej a+x
- ścieżka do rubiego w "shebang line" (pierwszej linii wskazującej interpreter) w plikach dispatch.cgi i dispatch.rb -- na wierzbie powinno to być #!/usr/bin/ruby
- log aplikacji (log/development.log) (patrz: "Jak przeglądać log aplikacji?")
- errorlog apache (patrz: "Jak przeglądać log Apache na wierzbie?")
- spróbowac uruchomić polecenie "rake" -- w odpowiedzi może zwrócić komunikat błędu
- spróbować uruchomić konsolę irb (polecenie irb1.8 na wierzbie) i wykonać komendę "load 'config/environment.rb'" -- jak wyżej
- spróbować uruchomić w linii poleceń plik public/dispatch.cgi -- jak wyżej
- Jak zrestartować serwer na wierzbie?
Na wierzbie aplikacje w Ruby on Rails uruchamiamy na serwerze Apache, a nie poprzez WEBrick, jak na zajęciach. Nie mamy więc uprawnień restartu serwera. Można sobie jednak z tym poradzić, ponieważ na ogół jedyne co potrzebujemy to możliwość przeładowania środowiska (doczytania nowych pluginów, bibliotek czy ustawień). Przeładowanie środowiska polega na wczytaniu pliku config/environment.rb. Najprościej wykonać to w ten sposób:
cd nasz_katalog_railsapp script/console > load 'environment.rb'W razie, gdyby polecenie script/console nie zadziałało (błąd irb), można sobie poradzić następująco:
cd nasz_katalog_railsapp irb1.8 > load 'config/environment.rb' - Na stronie wyświetla się napis podobny do: "Loaded suite /home/epi/agnessa/public_html/railsapp/public/dispatch.cgi Started Finished in 0.000332 seconds. 0 tests, 0 assertions, 0 failures, 0 errors", jak go usunąć?
Jest to zachowanie wywołane przez plugin file_column, pojawiające się przy serwowaniu stron przez Apache. Aby usunąć komunikat należy:
- otworzyć plik vendor/plugins/file_column/init.rb
- odnaleźć i wykomentować ('#') w nim linię: require 'test_case'
- zrestartować serwer