FAQ

Pytania można kierować do mnie mailem!

  1. 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ę:
    
    filter_parameter_logging :password
    
    Od tej pory hasło w logu aplikacji będzie filtrowane:
    
    Parameters: {"commit"=>"Log in", "action"=>"login",
    "controller"=>"account", "login"=>"admin",
    "password"=>"[FILTERED]"}
    
  2. Jak radzić sobie z kodowaniem znaków?
  3. Należy zwrócić uwagę na to, w jakim kodowaniu przechowujemy dane w bazie oraz wyświetlamy w widoku.
    1. definiujemy kodowanie poszczególnych tabel. W migracjach możemy przekazać kodowanie jako parametr dla funkcji create_table, np.
      
      create_table(
        :families, 
        :options => 'DEFAULT CHARSET=UTF8'
      ) do |t|
      ...
      end
          
      Aby sprawdzić kodowanie istniejących tabel, można skorzystać z polecenia:
      
      SHOW CREATE TABLE nazwa_tabeli;
          
    2. definiujemy kodowanie dla połączenia z bazą danych. W pliku database.yml w sekcjach development i production dodajemy parametr encoding, np.
      
      encoding: utf8
      
    3. 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
          
    4. definiujemy content-type w layoucie.
      
      <meta http-equiv="content-type" content="text/html;charset=utf-8" />
          
  4. 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
    
    end
    

    Nastę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])
        [...]
      end
    

    Sprawdzamy, 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 :)

  5. 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.

  6. Jak poradzić sobie z kodowaniem polskich znaków w plikach .rhtml w Aptanie?
    1. Okna -> Preferencje -> Ogólne -> Obszar roboczy -> Kodowanie pliku tekstowego: jeśli nie ma na liście iso-8859-2, to wpisać taką pozycję, zastosuj
    2. Okna -> Preferencje -> Ogólne -> Typy treści: dla wybranego typu plików ustawiamy domyślne kodowanie na iso-8859-2
  7. 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: latin2 w 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 
    	
  8. Jak zainstalować gem na wierzbie bez uprawnień administratora?
    Użytkownik może instalować poszczególne gemy w katalogu domowym. Instrukcja:
    1. utworzyć katalog, w którym będą instalowane gemy. Najlepiej o nazwie "gems" bezpośrednio w katalogu domowym:
      
      cd
      mkdir gems
      
    2. utworzyć ukryty plik o nazwie ".gemrc" w katalogu domowym
    3. 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
      
    4. sprawdzić, czy ustawienia zostały zaktualizowane:
      
      gem environment
      
    5. można już instalować gemy, na przykład:
      
      gem install RubyInline
      
  9. 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.

  10. 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.

  11. 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.

  12. 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).

  13. Jak używać Google Maps z pluginu ym4r na wierzbie?
    1. wygenerować klucz dla domeny wierzba.wzks.uj.edu.pl na stronie GMaps API signup.
    2. 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
          
    3. przeedytować plik(i), w których wywołujemy metodę GMap.header (layouty) dodając do jej wywołania parametr:
      GMap.header(:host => @request.host)
    4. przeedytować plik config/environment.rb, dodając na początku (najlepiej okoloce linii 5) ustawienie zmiennej oznaczającej środowisko uruchamiania:
      ENV['RAILS_ENV'] = 'development'
    5. 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 %>    
          
  14. 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
    Jeśli te sposoby zawiodą, należy poszukać dokładniejszego opisu błędu w kilku możliwych miejscach:
    • 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
  15.  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'
    	
  16. 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:

    1. otworzyć plik vendor/plugins/file_column/init.rb
    2. odnaleźć i wykomentować ('#') w nim linię: require 'test_case'
    3. zrestartować serwer