2012年01月24日

Ruby on Rails Rails3 NoMethodError: private method `readline'

NoMethodError: private method `readline'


rails2からrails3へバージョンアップしたときにでたエラーです。

環境


ruby1.9.3
rails3.0.7

状況


よくあるファイルのアップロードの箇所で起こったエラーです。
コントローラー側でparams[:file]といった具合にファイルを受け取って登録しようとしたら発生しました。(rails2では動いていて)

解決策


細かい説明は
Rails3 + fb_graphでFacebookに画像のアップロードをしてみる
こちらを参考にしていただき、結果としては
params[:file].tempfile.__getobj__

とすれば良い
posted by RicK at 11:48| Comment(0) | TrackBack(0) | 日記

2012年01月19日

Ruby on Rails ActionView::Template::Error (incompatible character encodings: ASCII-8BIT and UTF-8)

ActionView::Template::Error (incompatible character encodings: ASCII-8BIT and UTF-8)


rails2からrails3へVersionUpしたときに出たエラーです。

環境


ruby1.9.3
rails3.0.7
mysql5.0.77

状況


formでデータを入力するページで、
text_areaにデータを入力するのだが、
初期のデフォルトのデータとして、特定のhtmlファイルを読み込んでその内容をtext_area内に表示、
2度目以降はDBに登録されたデータをtext_area内に表示するという仕組みがある。

このページをrails2からrails3へVersionUpした後に遷移したら
ActionView::Template::Error (incompatible character encodings: ASCII-8BIT and UTF-8)

というエラーが発生した。

原因


ruby1.9から文字列にエンコーディングが設定されて、
それがデフォルトでASCII-8BITになるのだが、DB adapter(MySQL/Ruby)がエンコーディングを気にせずに、デフォルトのASCII-8BITのまま返してしまうのが原因らしい。

だが、ruby1.9は前から使っていたが発生していないが?
rails3もなにか関係しているんだろうな。

解決策


他のサイト等を見るとバッチあてるとあるが、
1箇所だけで他のところはなんにもないのであまり変えたくないなーと思ったので、
ASCII-8BITに変換されるならUTF-8に変換してしまうことにしました。

ruby1.9からStringに文字コード系のメソッドが追加されたようです。
Ruby1.9をこれから使う人のためのM17Nまとめ
上記の中の
String#force_encoding(encoding)

こいつを使って
@hoge.force_encoding("UTF-8")

これで完成。
このまま登録して、再度外してもエラーになったので、
表示のコードを変換したからといって登録されるデータが変わるでもないので、
とりあえずこれで問題なし。
posted by RicK at 10:41| Comment(0) | TrackBack(0) | 日記

2012年01月17日

Ruby on Rails Rails3 link_toでputとdeleteしたらログアウト

link_toのputとdeleteでログアウト


これは何かというと、rails2からrails3にversionupしたら
いままで普通に動いていた
link_to hoge_path, :method => :delete

この削除リンクで、削除はできるが、削除した後にログアウトするという現象が発生した。

環境


ruby1.9.3
rails3.0.7

状況


link_toのputとdeleteで発生、getは問題なくpostは試していない。
form_tagのputとdeleteでは問題なく動作する。

原因


link_toとform_tagで何が違うのかよく見たところ
form_tagの場合は
<input name="authenticity_token" type="hidden" value="57NpCqL11bcGsEQNpnjjWqMxbRrqefq2fBMkjEf+4FI=">

このようなhiddenが入っていた。

これはrailsが自動的にCSRF対策を行い
params[:authenticity_token]とsession[:csrf_id]を比較して、同値であればOKというようにしているらしい。
というわけでこれをlink_toに持たせれば解決じゃね?と思い実行

解決策


authenticity_tokenはform_authenticity_tokenというメソッドで取得可能なので、
link_to hoge_path(削除したいitem, :authenticity_token => form_authenticity_token), {:method => :delete}

こんな感じで問題なく動作しました。

ただ、「railsのajax用のヘルパを使わずに、独自にjavascriptを書いてdbをいじる時は手動でauthenticity_tokenをいれてあげないといけません。」
という文をみつけたので、実はjavascriptとかそっちのほうの設定とかなんやらに問題があるのかも?

rails3のよく使うコマンドについて下記に書いてあります。
(サイトがめっちゃ重い時もあります;)
Ruby on Rails Rails3コマンド 〜よく使うコマンド〜
posted by RicK at 09:35| Comment(0) | TrackBack(0) | 日記