削除機能をrjsで実装してみる。

次は、Ajaxっぽく、行削除を実装します。
RailsのRJS機能を利用します。


9.link_to_remoteでリクエスト!!
Ajaxへリクエストを投げる為にAタグを利用してイベントを作りますが、
普通にa href="URL"だと画面が切り替わります。
a href="#" onclick="new Ajax.Request ... と、Ajax系のリクエストを
生成するイベントを記載する必要がありますが、やはりRailsの link_to_remote を
使うと楽にかけます。

link_to_remote("リンク名", :url => { URLとオプション })

こんなんでOKです。

今まで作ってたapp/views/test/list.rhtmlのリスト表示部分に、削除へのリンクを
作ってみます。

<html>
  <head>
    <title>
      名簿管理アプリケーション
    </title>
    <%= javascript_include_tag :defaults %>
  </head>
  <body>
    <hr>

    <ul id="members">
      <% for @member in @members %>
      <li id="member_<%=@member.id %>" >
         名前 : <%= in_place_editor_field :member, 'name'     , {}, { :save_text=>"保存", :cancel_text=>"取消" } %> /
         どんな人 : <%= in_place_editor_field :member, 'atitude'     , {}, { :save_text=>"保存", :cancel_text=>"取消" } %> /
        <%= link_to_remote("削除", :url => { :action => :del,:id => @member.id }) %>
      </li>
      <% end %>
    </ul id="members">

    <hr>
    <%= form_tag :action => 'add' , :id => @member %>
      <p>名前 <%= text_field 'member','name' %>どんな人 <%= text_field 'member','atitude' %><%= submit_tag '登録' %></p>
    <%= end_form_tag %>
  </body>
</html>


10.削除するメソッドを作成
アップデートと同様、削除の受け皿も必要になります。
と言うわけでdelメソッドを作成します。
今回は、送られてきたパラメータのDBを削除するだけなので、そのまま書く事に。*1

class TestController < ApplicationController
  in_place_edit_for :member, :name
  in_place_edit_for :member, :atitude

  def list
    @members = Member.find(:all , :order => "position")
  end

  def add
    @member = Member.new(params[:member])
    @member.save! unless @member.name.blank?

    redirect_to :action=>'list'
  end

  def del
    Member.find(params[:id]).destroy
  end

end

11.RJSを実装する。
RJSで、選択された行を削除するメソッドを実装します。
app/views/test/del.rjs と言うファイルを作成します。
と言っても1行です。
member_idの行を削除しろーって命令です。

page.remove "member_" + params[:id]

これで、削除ボタンを押すと画面上からもDB上からもその行を削除出来る様になりました。

*1:例外処理は無視してます。めんどうなので・・・・・【何】