1

我有以下情况:

我有一个风险模型,在我看来,它向我展示了一个包含所有风险的表格。该表还包括一个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 传递给该方法的最佳方法是什么。

谢谢你的帮助。

4

2 回答 2

0

注意:这与您想要的略有不同,但可能会提供更好的用户体验,因为他们不必单击末尾的其他按钮来更新记录,因此请小心谨慎。不管怎样,你都会得到一个很好的例子来说明如何使用 ajax 来满足你自己的需要。

首先,您需要在控制器中创建一个操作来更新您已经拥有的记录。不同之处在于,您将希望在最后呈现 json,而不是呈现 html。这样的事情会做。

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 注入数组,然后当用户单击提交按钮时,数组作为参数发送到操作,然后循环遍历数组并更新风险。

我相信有更好的方法,这只是我想到的第一件事。

于 2013-05-30T23:38:02.730 回答
0

您最好的选择是将所有复选框放在表单中。

<%= form_tag controller_method_name_your_controller_path, :method => 'get', do %>
    ...
    <%= submit_tag 'submit' %>
<% end %>

在 routes.rb 文件下声明路径your_controller

get :controller_method_name

您可以使用以下命令将复选框组合在一起check_box

<%= check_box 'mergerisks', risk.id %>

然后params[:mergerisks]在控制器中使用将返回一个哈希值risk.id作为键和一个1 or 0取决于复选框是否被选中。

有关路线和表格的一些文档:

http://guides.rubyonrails.org/routing.html

http://guides.rubyonrails.org/form_helpers.html

于 2013-05-31T00:12:20.930 回答