好的。我相信我已经找到了一个很好的实现。
诀窍是创建一个封装按钮的表单,以便在单击按钮时点击正确的控制器。在我的例子中,我使用 railsform_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>
在这个部分中有两件事应该引起注意。
- 由于这是作为列表的一部分呈现的部分内容,因此您希望为每个列表项提供一个唯一的 id,以便您的 javascript 仅作用于该元素。这是在第一行完成的
<div id=<%= list_item.id %>>
,我知道这将是唯一的,因为列表中的每个 Developer 都必须具有唯一的 ID。
:remote => true
是form_for
函数的必要参数,这是导致在后台发出请求而不是加载新页面的原因。
此表单在提交时会Developer#toggle
使用两个参数触发我的操作:act
,它是activate
or deactivate
,id
它是我们正在操作的 Developer 的 id。这两个参数都是表单中的隐藏字段。
提交表单后,在控制器内部,我只需获取正确 Developer 的实例(在我的情况下,这样做相当复杂,但在大多数情况下可能类似于@dev = Developer.find(id)
),并执行激活/停用所需的步骤开发商。
最后,我在toggle.js.erb
View 目录中为我的 Developer 控制器创建了一个文件,一旦控制器完成其任务就会呈现该文件。该文件简单地获取元素(通过我们在部分中提供的唯一 id)并通过重新渲染部分来替换内部 html,如下所示:
document.getElementById("<%=escape_javascript(@dev.id)%>").innerHTML="<%=escape_javascript(render :partial => 'developer/list_item', :object => @dev) %>";
结果是在开发人员活动状态发生变化后重新渲染部分,从而产生适当的Activate
或Deactivate
按钮。
我意识到这个答案高度关注我的特定应用程序,特别是需要处理活动与非活动的切换,但是我相信它很容易简化并适应可能需要较少复杂性的其他情况。