2011年9月18日日曜日

rails jqgrid controllerでlink_to :method=>:deleteは動かない

jqgridをrailsから利用して削除リンク(:method=>:delete)を埋め込む。

苦労したので投稿しよう・・・。

  1. 調査
  2. 方向性の転換
  3. 結果

(2011/10/7)
こちらの方が多分綺麗。inlineで作ってもいい。
http://seo-trial.blogspot.com/2011/09/rails-controllerview.html



1.調査
Railsと親和性が高そうなjqgrid(http://www.2dconcept.com/jquery-grid-rails-plugin)を調査。
jsonで表示する値を取得するのはajax系gridの定番の処理なので気にしない。

リンクを埋め込むにはcontrollerでlink_toをするのが簡単かな?書いてみた。
  • h=ApplicationController.helpers
  • h.link_to('Destroy',:confirm => 'Are you sure?', :method => :delete)
結果、「undefined method `protect_against_forgery?' for nil:NilClass」
調べると、url_helper.rb内のjavascriptを出力する関数で
authenticity_tokenが取得できずに動かない。

2.方向性の転換
showなどは動くので「仕様」として受け止め、解決策を見つけることにした。
独自のhelperでLINK_TOが出力する内容を(token以外)そのまま出力するものを用意。
出力するauthenticity_tokenにはhtml内で重複しないであろう値をダミーで出力。
jqgridがjsonの値を読み込み終えた段階(grid_loaded)でjQueryで塗り替えることとした。
以下、紆余曲折の結果。

(scriptタグ付けると削除する仕様ですか、googleさん・・・orz)


<script language="Javascript">
  function GetAuthenticity_Token() { return "<%= form_authenticity_token %>"; }
  function test() {
    var u = $('#logs a[onclick]')
    if (u) {
      u.each(function() {
        var v = String($(this).attr('onclick'))  //関数を文字列化
        v = v.replace("|authenticity_token|", GetAuthenticity_Token); //ダミーの置換
        eval("m = " + v);  //文字列を関数に変換。vはfunction(){}の形式
        $(this).removeAttr("onclick");  //onclickは不要。可読性の為削除
        $(this).bind("click",m);  //OK
      })
    }
  }
</script>

3.結果
IE8、chrome、firefoxで動いた。
ここに至るまで丸一日かかったけどね・・・。


0 件のコメント:

コメントを投稿