Railsy i Oracle

No i utknąłem.

Wszystko byłoby naprawde dobrze gdyby nie kodowanie Oracla CP1250. Niestety nie mogę go zmienić a muszę jakoś używać polskich znakow.

Otóż moj problem polega na tym iż Oracle musi być kodowany cp1250 (korzystają z niego inne aplikacje) a railsy muszą używać utf-8 gdyż inaczej wykładają się javascripty pod IE (a ajax i rjsy to polowa aplikacji). Szukam rozwiązania tego problemu.

Najskuteczniejsze według mnie byloby wymuszenie konwersji znakow podczas polaczenia (w obie strony) gdyż jak juz pisalem zmiana kodowania żadnej ze stron nie wchodzi w gre (chyba ze ktos zna dobre rozwiazanie problemu js w CP1250 pod IE)

Może jest coś o czym nie wiem wiec dziekuje z gory za wszelkie rady

Pomocny może być artykuł Kodowanie polskich znaków w Ruby on Rails. W szczególności, rozdział o połączeniu Rails z bazą danych opisuje, jak ustawić kodowanie znaków dla połączenia. Testowałem to tylko na MySQL.

Na marginesie, współdzielenie bazy z innymi aplikacjami może być kłopotliwe. Filozofia RoR zakłada, że baza jest robiona “pod niego”.

no na razie po ciezkim dniu grzebania wypracowalem takie moje smieszne rozwiazanie

caly projekt (w radrailsie jest tworzony w kodowaniu cp1250 ) takim jak baza i wykorzystuje after_filter:

Filters added to this controller will be run for all controllers in the application.

Likewise, all the methods added will be available for all controllers.

class ApplicationController < ActionController::Base
after_filter :convert_response
def convert_response
@response.body = Iconv.new(“UTF-8”,“cp1250”).iconv(@response.body)
end

def cv(value)
return Iconv.new(“cp1250”,“UTF-8”).iconv(value)
end
end

funkcja cv jest wywolywana dla kazdego przychodzacego parametru przyjmujacego nazwy z polskimi znakami
(na szczescie to aplikacja biznesowa i ma glownie cyferki :))

dzieki temu calosc html pojawiajaca sie na stronie jest kodowana w utf8 co zadowala javascripty i mnie bo do bazy wrzucane sa stringi kodowane w cp1250.

ps jezeli ktos zna dobry sposob przekonwertowania przychodzacych request_parameters to czekam na info

tu wybralem reczne kodowanie wybranych parametrow gdzyz nie wszystkie musza byc skonwertowane a poza tym nie wiem jak przypisac wartosc do request_parameters :wink:

pozdrawiam PM

Co z zaproponowanym przeze mnie rozwiązaniem? Czy z jakiegoś powodu nie działało?

Popełniłem kiedyś taką funkcję, ale nie zalecam jej używania. Sugeruję zainteresować się jednak standardowymi metodami rozwiązywania problemów z kodowaniem (wspomniany artykuł).

[code=ruby]
before_filter :convert_from_utf8

protected

def convert_from_utf8
converter = Iconv.new( ‘cp1250’, ‘utf-8’ )
p = convert_hash_tree( params, converter )
self.params = p
end

private

def convert_hash_tree( node, converter )
res = nil
if node.class.name == ‘HashWithIndifferentAccess’
res = HashWithIndifferentAccess.new()
node.each { |k, v| res[k] = convert_hash_tree( v, converter ) }
elsif node.class.name == ‘String’
begin
res = converter.iconv( node )
rescue Iconv::IllegalSequence => e
raise ‘Fuck! - Illegal sequence in [’ + node.to_s + ‘]’
end
else
res = node # Leave as it is
end
return res
end[/code]

:confused: no wlasnie encoding w database.yml nie dziala gdyz oracle nie ma funkcji set names

na szczescie po upartych poszukiwaniach trafilem na prostsze rozwiazanie

ENV['NLS_LANG']='polish_poland.UTF8'

trzeba to wkleic na poczatku boot.rb przed inicjalizacja database.yml

ustawia to zmienna srodowiskowa dla railsow (niestety stala dla wszystkich polaczen z baza)
i wymusza odpowiednie kodowanie polaczenia

pozdrawiam

PM

To jest ustawienie dla Oracla, a nie RoR: NLS_LANG environment variable i wygląda na to, że to jeden z lepszych sposobów na kodowanie Oracle w Twoim przypadku.