Ruby on Rails - 调用Controller Method并将参数传递给它

时间:2013-05-30 22:57:00

标签: javascript ruby-on-rails controller

我有以下情况:

我有一个风险模型,在我的观点中,它显示了一个包含所有风险的表格。该表还包含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传递给方法。

感谢您的帮助。

2 个答案:

答案 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

下的routes.rb文件中声明路径
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