【问题标题】:Link_to and ajax request in Rails 4Rails 4 中的 Link_to 和 ajax 请求
【发布时间】:2016-10-26 18:21:20
【问题描述】:

我有以下几点:

<%= link_to "Some_link", some_path, class: "btn btn-success btn-xs", id: "contact", "data-sid" => item.id %>

在我的 application.js 我有:

$('#contact').click(function (e) {
    e.preventDefault();

    var item_id = $(this).data('sid');

    $.ajax({
      type: 'GET',
      url: '/somepath'+ item_id,
      success: function(data) {
       $("#edit-project-modal").find("input[name='id']").val(data.id);
       $("#edit-project-modal").find("input[name='name']").val(data.name);

     },

      error: function() {
       window.alert('Error Loading Item!!');
      }
   });
});

路径“some_path”将有一个表格供用户填写。话虽如此,我真正想要实现的是当用户单击链接“Some_link”时,该链接可以将用户重定向到“some_path”,但在此之前我想执行 ajax 请求以将数据加载到表单中。我不知道在这种情况下是否可以使用 :remote=>"true" 。现在发生的事情是,当我单击链接时,ajax 工作但它没有将我发送到页面。

我做错了什么?有什么建议么。 先感谢您。

【问题讨论】:

  • 我能问一下,想要填充表单但还要重定向的驱动力是什么?我很难理解这里对 AJAX 的需求。
  • @henners66 我使用 ajax 请求 API 数据。我将使用这些数据来填写表格的一部分。当我单击链接时,我看到 ajax 请求有效,但没有带我去任何地方。
  • @henners66 链接上的路径和调用API数据的路径不一样。
  • 好的,我明白这一点,但是,我仍然不明白你为什么要这样做。 a) 您是否希望能够单击链接并让它执行 AJAX 请求和标准 HTTP GET ? b) 如果你是 - 你为什么要麻烦在表单上填充数据然后立即离开页面?这是我很难理解的:)
  • 链接不在表单页面中。此链接位于我的应用程序的另一部分。我正在尝试使用 link_to 助手将用户带到表单页面并进行 ajax 调用。

标签: ruby-on-rails ajax link-to


【解决方案1】:

好的,现在我更了解您的要求,我觉得我更有能力帮助您。你有很多过于复杂的事情,而你试图解决这个问题的方法是行不通的。

目前$('#contact').click(function (e) 的方式是捕获点击事件,然后尝试执行 AJAX 查询 - 我假设您正在从控制器发回数据,而不是从中进行任何渲染。您收到数据,然后尝试填充表单字段,但这些表单字段当然不存在......您还没有导航到该页面 - 此时您的 jquery 很可能正在静默失败。

现在,由于您已吞下该事件并阻止了默认行为,因此您的链接的原始路径不被遵循。即使您允许事件传播,它也不会像上一段中突出显示的那样工作。

好吧,不知道你的进一步要求是什么,在我看来你需要做的就是

  1. 删除所有的 jquery。
  2. 允许 link_to 像普通 HTTP GET 一样点击您的操作。

    &lt;%= link_to edit_item_path(item), class: "btn btn-success btn-xs", id: "contact" %&gt;

    ** 假设您有一个带有编辑操作的 ItemController 并且路由设置为

    edit_item GET /items/:id/edit(.:format) items#edit

  3. 将数据设置为控制器中的实例变量

    @item = Item.find(params[:id])

  4. 使用实例变量将表单呈现为 html.erb -

例如,

<%= form_for @item, url: item_path do |f| %>
  <%= f.label :name %>
  <%= f.text_field :name %>
  <input type='submit'/>
<% end %>

只是一个简单的导航到一个表单。

【讨论】:

  • 我可以做到这一点,但我现在的问题是我如何才能拥有链接到它的这个特定项目的 id att。我有一个项目列表,所有项目都单独附有此链接。如果您在我的 link_to 上注意到我正在记录项目 ID。感谢您的帮助。
  • 只是简单的&lt;%= link_to "Some_link", some_path(item), class: "btn btn-success btn-xs", id: "contact" %&gt; 假设你在你的路由中有类似的东西 - 通常你会在你的控制器中有一个编辑操作并且路由看起来像:edit_user GET /users/:id/edit(.:format) users#edit 这将被调用为@987654328 @ 将在 UserController 上触发 edit 操作 - 我认为这就是您要执行的操作...编辑现有模型实体。
  • 更新了解决方案,希望它更清晰
  • 非常感谢。你的例子对我很有帮助。
【解决方案2】:

假设你想:

  1. 点击“一些链接”(通过 AJAX)
  2. 然后,联系表单出现在“某些链接”下方

您可以使用以下内容:

<%= link_to "Some_link", some_path, class: "btn btn-success btn-xs", id: "contact", "data-sid" => item.id %>
<section id='contact-form'></section>

$('#contact').click(function (e) {
  e.preventDefault();

  var item_id = $(this).data('sid');

  $('#contact-form').load('/somepath'+ item_id, function(response, status, xhr){
    if (status === "error") {
      window.alert('Error Loading Form!!');
    }
    else {
      window.alert('Success Loading Form!!');
    }
  })
);

【讨论】:

  • some_path 将带我进入表单,ajax URL 路径是请求 json 数据的 API 路径。它们是不同的。对不起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
相关资源
最近更新 更多