Rails 4中的Link_to和ajax请求

时间:2016-10-26 18:21:20

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

我有以下内容:

<%= 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 =&gt;“true”。现在发生的事情是,当我点击链接时,ajax可以工作,但它没有将我发送到页面。

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

2 个答案:

答案 0 :(得分:0)

假设你想要:

  1. 点击“Some Link”(通过AJAX)
  2. 然后,联系表单出现在“Some Link”
  3. 下方

    您可以使用以下内容:

    <%= 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!!');
        }
      })
    );
    

答案 1 :(得分:0)

好的,现在我了解你的要求好多了,我觉得我更能帮助你。你有太多复杂的东西,你尝试解决这个问题的方式是行不通的。

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

现在因为您吞下了该事件并阻止了默认行为,因此未遵循链接的原始路径。即使您允许事件传播,它也不会像前一段中所强调的那样起作用。

好的,不知道你的进一步要求是什么,对我来说,你似乎只需要做的就是

  1. 删除所有jquery。
  2. 允许link_to以普通的HTTP GET命中您的操作。

    <%= link_to edit_item_path(item), class: "btn btn-success btn-xs", id: "contact" %>

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

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

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

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

  4. 使用实例变量 -

  5. 将表单呈现为html.erb

    例如,

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

    直接导航到表单。