好的。我相信我已经找到了一个很好的实现。
诀窍是创建一个封装按钮的表单,以便在单击按钮时点击正确的控制器。就我而言,我使用了 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 %>>
,我知道它是唯一的,因为列表中的每个开发人员都必须有一个唯一的 id。
-
:remote => true
是一个必要的论证form_for
这就是导致在后台发出请求而不是加载新页面的原因。
此表格提交后会点击我的Developer#toggle
有两个参数的动作:act
,这是activate
or deactivate
and 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
or Deactivate
button.
我意识到这个答案高度关注我的特定应用程序,特别是需要处理活动与非活动的切换,但是我相信它很容易简化并适应可能需要较低复杂性的其他情况。