Problem jak w temacie.
Wiem, że temat był poruszany wiele razy, jednak prześledziłem kilkanaście wątków i nie znalazłem rozwiązania.
Dodam, że wersja:
railsów to 2.3.5,
ruby’ego: 1.9.1p378 (2010-01-10 revision 26273) [i386-mingw32]
mysql 5.1.36
Sterowniki do bazy instalowałem komendami:
gem install mysql
gem install mysql-ruby
Pracuję na Windows 7 x64.
Problem pojawia się po wysłaniu formularza, w którego polach podaję m.in. polskie znaki. W konsoli otrzymuję błąd treści:
Error during failsafe response: “\xC5” from ASCII-8BIT to UTF-8
ERROR NoMethodError: You have a nil object when you didn’t expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each
Mój plik database.yml ma wpis:
development:
adapter: mysql
encoding: utf8
reconnect: false
database: development
pool: 5
username: root
password:
collation: utf8_polish_ci
host: localhost
Odpowiednio mam ustawione kodowanie w bazie. Z racji, że korzystam z WampServera mam w pliku my.ini ustawione sekcje
[client]
default-character-set=utf8
[mysqld]
port=3306
character-set-server=utf8
collation-server=utf8_polish_ci
default-character-set=utf8
Może jeszcze dodam, że metoda kontrolera dodająca wpis do bazy ma postać
[code]def add
if session[:user_id].nil?
redirect_to :controller => ‘user’, :action => ‘login’ and return
else
if request.post? and params[:watek] @watek = Watek.new(params[:watek])
@watek.topic = @watek.topic.force_encoding('utf-8')
@watek.contents = @watek.contents.force_encoding('utf-8')
@watek.tags = @watek.tags.force_encoding('utf-8')
if @wthread.save
flash[:notice] = "watek dodany"
else
flash[:notice]="akcja nieudana."
end
end
end
Czy jesteś pewien że przeglądarka dobrze koduje zapytanie - czyli jako UTF-8? Najlepiej odpowiednie i upewnienie się, że nie jest ręcznie ustawione kodowanie znaków w przeglądarce. Czy możesz podać pełny stack trace wyjątku?
Na 100% lepiej nie ufać czy przeglądarka ustawia poprawnie kodowanie. Oczywiście trzeba to robić, ale zawsze lepiej być świadomym, że świat przeglądarek nie jest idealny.
Dzięki za wskazówki. Próbowałem zainstalować jak to @apohllo nazwał “poprawioną” wersję MySql-a, ale konsola wyświetliła mi poniższe komunikaty:
[code]C:\Windows\System32>gem install jzajpt-mysql-ruby
Building native extensions. This could take a while…
ERROR: Error installing jzajpt-mysql-ruby:
ERROR: Failed to build gem native extension.
C:/Ruby19/bin/ruby.exe extconf.rb
Trying to detect MySQL configuration with mysql_config command…
Failed to detect MySQL configuration with mysql_config command.
Trying to detect MySQL client library…
checking for mysql_query() in -lmysqlclient… *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers. Check the mkmf.log file for more
details. You may need configuration options.
Provided configuration options:
–with-opt-dir
–without-opt-dir
–with-opt-include
–without-opt-include=${opt-dir}/include
–with-opt-lib
–without-opt-lib=${opt-dir}/lib
–with-make-prog
–without-make-prog
–srcdir=.
–curdir
–ruby=C:/Ruby19/bin/ruby
–with-mysql-config
–without-mysql-config
–with-mysql-dir
–without-mysql-dir
–with-mysql-include
–without-mysql-include=${mysql-dir}/include
–with-mysql-lib
–without-mysql-lib=${mysql-dir}/lib
–with-mysqlclientlib
–without-mysqlclientlib
C:/Ruby19/lib/ruby/1.9.1/mkmf.rb:364:in try_do': The complier failed to generate an executable file. (RuntimeError) You have to install development tools first. from C:/Ruby19/lib/ruby/1.9.1/mkmf.rb:417:intry_link0’
from C:/Ruby19/lib/ruby/1.9.1/mkmf.rb:421:in try_link' from C:/Ruby19/lib/ruby/1.9.1/mkmf.rb:529:intry_func’
from C:/Ruby19/lib/ruby/1.9.1/mkmf.rb:750:in block in find_library' from C:/Ruby19/lib/ruby/1.9.1/mkmf.rb:670:inblock in checking_for’
from C:/Ruby19/lib/ruby/1.9.1/mkmf.rb:276:in block (2 levels) in postpone' from C:/Ruby19/lib/ruby/1.9.1/mkmf.rb:250:inopen’
from C:/Ruby19/lib/ruby/1.9.1/mkmf.rb:276:in block in postpone' from C:/Ruby19/lib/ruby/1.9.1/mkmf.rb:250:inopen’
from C:/Ruby19/lib/ruby/1.9.1/mkmf.rb:272:in postpone' from C:/Ruby19/lib/ruby/1.9.1/mkmf.rb:669:inchecking_for’
from C:/Ruby19/lib/ruby/1.9.1/mkmf.rb:746:in find_library' from extconf.rb:53:in’
Gem files will remain installed in C:/Ruby19/lib/ruby/gems/1.9.1/gems/jzajpt-mysql-ruby-2.8.1 for inspection.
Results logged to C:/Ruby19/lib/ruby/gems/1.9.1/gems/jzajpt-mysql-ruby-2.8.1/ext/gem_make.out[/code]
Nie bardzo wiem, co powinienem zrobić.
PS. Czy mógłbyś mi wytłumaczyć jakie korzyści przyniosłaby mi przesiadka na Ruby 1.9.2, odnośnie mojego problemu.