在ajax:beforeSend(link_to)中添加额外的数据?

3

我有一个link_to,它的remote:设置为true。我想做的是在请求中添加一个额外的属性,所以我尝试使用以下代码:

<script>
  $(document).ready(
      function(){
        $("#part_btn").bind("ajax:beforeSend",
            function(event, xhr, settings, data){
              settings.data += "&user_id=5"
            })
      })
</script>

现在我甚至不知道这是否可行,因为user_id从未发送到控制器,并且当我记录setting.data时,我得到的是null&user_id=5

如果不可能这样做,还有其他方法吗?

编辑:

我没有向link_to添加额外的参数,因为user_id实际上来自选择标签,我想将选择的值作为额外数据添加,就像这样:

settings.data += ("&user_id="+$("#register_user_id option:selected").val());

这是我的link_to的样式:

  <%= text_field_tag :part_id, nil, :class => 'text_field', data: {source: autocomplete_parts_for_registers_registers_path} %>
  <%= link_to('toevoegen', '#!', id: 'part_btn', class: 'btn btn-small btn-success addbtn', style: "margin-top: 5px", data: {source: add_part_registers_path}, remote: true) %>
2个回答

0

与其采用JavaScript的方法,不如考虑在link_to中将参数与路由一起发送:

link_to "My link", some_path(user_id: 5), remote: true, method: :post

这将会在控制器中为some_path添加一个值为5的:user_id参数。

此外,您可以使用链接上的data:属性来向XHR请求添加任何参数。

link_to "My link", id: "user_link", some_path, remote: true, method: :post, data: { params: { user_id: 123 }.to_param }

如果您需要动态更改值:
$("#user_select").change(function() {
  user_id = $(this).val();
  $("#user_link").data("params", "user_id=" + user_id);
})

实际上,这正是Rails使用jquery_ujs发送AJAX值的方式。

显然,在服务器端要检查user_id的值。


我也考虑过这个,但我想发送从选择标签中选择的值,我只是简化了我的代码,使其更易于阅读(也许不是一个好主意)。 - Kupi
好的,那么您可以使用$('#user_select').change事件动态更改data-params="user_id=5"的值。 - Anthony E
好的,我会先尝试这个,但是在ajax:beforeSend中没有添加数据的方法吗? - Kupi
我认为没有简单的方法。即使Rails本身也不修改ajax:beforeSend以发送参数,它使用上述方法,我认为这是更清晰的方法,因为您可以更轻松地从Rails控制台进行调试。我不确定settings是否只读。如果这是一个GET请求,则可以通过settings.url + =&newProp = newValue附加到URL中。但是不确定百分之百。 - Anthony E
好的,数据参数已更改,但用户ID未发送到服务器...我在我的问题中添加了link_to,以防有什么问题。 - Kupi
显示剩余4条评论

0

我认为在用户通过JavaScript或额外的Ajax调用更改下拉菜单时更新link_to的最佳且最简单的方法。

JS
$("#user_select").change(function() {
  user_id = $(this).val();
  $("#user_link").data("params") = "user_id=" + user_id;
})

Extra Ajax
send user_id to server with user_id and make a method_name.js.erb and update link from there
like:
link_to "link", method_path(user_id: params[:user_id]), remote: true

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接