我有以下情况:
我有一个风险模型,在我的观点中,它显示了一个包含所有风险的表格。该表还包含check_box_tag
,因为应该能够检查每个风险。在表头中有一个按钮,如果单击此按钮,则应调用风险控制器的方法,并且应将所有已检查的风险ID作为参数。
实际上,我不知道哪种方法可以解决这个问题。
到目前为止我有以下代码:
查看:
<table>
<thead>
<tr>
<th>Risk Name</th>
<th>
<button id="mergerisks">Merge Risks</button>
</th>
</tr>
</thead>
<tbody>
<% Risks.all.each do |risk| %>
<tr>
<td><%= risk.name %></td>
<td><%= check_box_tag 'mergerisks', risk.id %>
</td>
</tr>
<% end %>
</tbody>
</table>
使用Javascript:
$( "#mergerisks" ).on( "click", function() {
var selectedriskmerge = new Array();
$("input:checked").each(
function() {
selectedriskmerge.push($(this).val());
});
});
修改 添加了以下对javascript的ajax调用
$.ajax({
url: '/riskmerge',
data:selectedriskmerge,
success:function() {
window.alert("Success!");
}
});
现在Button只触发Javascript,并且所有已检查的风险的ID都存储在数组中。
但现在我不知道在风险控制器中调用控制器方法的最佳方法是什么,并将所有已检查风险的ID传递给方法。
感谢您的帮助。
答案 0 :(得分:0)
注意:这与您想要的略有不同,但可能会提供更好的用户体验,因为他们不必在最后点击其他按钮来更新记录,因此请谨慎使用。无论如何,你会得到一个很好的例子,说明如何根据自己的需要使用ajax。
首先,您需要在控制器中创建一个操作,以更新您已拥有的记录。扭曲的是,你不想渲染html而是想在最后渲染json。这样的事情就可以了。
if risk.update_attribute(check: true)
render :json => { status: "Everything worked!"}
else
render :json => { status: "Something went wrong!"}
end
接下来,您需要设置javascript,以便在单击复选框时,会向更新记录的操作发送ajax帖子。你用你的javascript部分完成了这个。在您的点击事件中,您可以拥有类似
的内容$.post("/risk_update",
// This line below is the parameters sent to the action.
//So your action will recognize params[:risk_id]
{ risk_id: $(".clicked_check_box").attr("value") },
"json")
.done(function (responseText) {
if (responseText.status === "Everything worked!") {
// Do something on success of info being saved
} else if (responseText.status === "Something went wrong!") {
// Do something on failure of info being saved
}
});
最后,复选框出现问题。您是否希望用户取消选中该框并再次呼叫记录。这当然超出了对问题的讨论,但它们是你必须记住的一些事情。
当然,在您的情况下,您需要单击一个抓取所有ID的按钮并将其发送到操作以更新记录。一种方法是在标记复选框时让javascript将id注入数组,然后当用户单击提交按钮时,数组将作为params发送到操作,然后循环遍历数组并更新风险。
我确信有更好的方法,这只是我想到的第一件事。
答案 1 :(得分:0)
您最好的选择是将所有复选框放在表单中。
<%= form_tag controller_method_name_your_controller_path, :method => 'get', do %>
...
<%= submit_tag 'submit' %>
<% end %>
在your_controller
get :controller_method_name
您可以使用check_box
:
<%= check_box 'mergerisks', risk.id %>
然后在控制器中使用params[:mergerisks]
将返回一个哈希,其中risk.id
为密钥,而1 or 0
则取决于是否选中了复选框。
有关路线和表格的一些文件: