Ok。私はこれの良い実装を見つけたと信じています。
秘訣は、ボタンがクリックされたときに適切なコントローラーを押すために、ボタンをカプセル化するフォームを作成することです。私の場合、次のように、rails関数を使用して、Developerコントローラーの部分ビューform_tag
内にボタンを生成しました。_list_item.html.erb
<div id=<%= list_item.id %>>
<%= form_tag "/Developer/toggle", :method => "get", :remote => true do %>
<p>
<% if list_item.inactive? %>
<%= submit_tag "Activate", :name => nil %>
<input type="hidden" name="act" value="activate" />
<% else %>
<%= submit_tag "Deactivate", :name => nil %>
<input type="hidden" name="act" value="deactivate" />
<% end %>
</p>
<input type="hidden" name="dev_id" value=<%=list_item.id%> />
<% end %>
</div>
このパーシャル内で注意を喚起すべき2つのことがあります。
- これはリストの一部として部分的にレンダリングされるため、JavaScriptがその要素のみに作用するように、各リストアイテムに一意のIDを指定する必要があります。これは最初の行で行われます。これは
<div id=<%= list_item.id %>>
、リスト内の各開発者が必ず一意のIDを持っているため、一意になることがわかっています。
:remote => true
関数に必要な引数form_for
です。これにより、新しいページをロードするのではなく、バックグラウンドでリクエストが行われます。
このフォームは、送信されるDeveloper#toggle
と、2つのパラメーターを使用してアクションにヒットします。act
これは、またはのいずれactivate
かdeactivate
であり、操作しid
ている開発者のIDです。これらのパラメータは両方とも、フォーム内の非表示フィールドです。
フォームが送信された後、コントローラー内で、正しい開発者のインスタンスを取得し(私の場合、それはかなり複雑ですが、ほとんどの場合、のようなものです@dev = Developer.find(id)
)、アクティブ化/非アクティブ化に必要な手順を実行します開発者。
最後にtoggle.js.erb
、開発者コントローラーのビューディレクトリ内にファイルを作成しました。このファイルは、コントローラーがタスクを完了するとレンダリングされます。このファイルは、要素を(パーシャルで指定した一意のIDを介して)取得し、次のようにパーシャルを再レンダリングすることで内部のhtmlを置き換えます。
document.getElementById("<%=escape_javascript(@dev.id)%>").innerHTML="<%=escape_javascript(render :partial => 'developer/list_item', :object => @dev) %>";
その結果、開発者のアクティブステータスが変更された後に部分的に再レンダリングされ、適切なActivate
またはDeactivate
ボタンが表示されます。
この回答は、特にアクティブと非アクティブの切り替えに対処する必要がある特定のアプリケーションに非常に焦点を当てていることを認識していますが、簡単に簡略化でき、複雑さを必要としない他のケースに適応できると思います。