【问题标题】:delete and update a object of associated model using ajax and rails使用 ajax 和 rails 删除和更新关联模型的对象
【发布时间】:2016-05-02 08:59:05
【问题描述】:

我有两个模型。比如说defectsproducts

product has_many :defects

defect belongs_to :product

1) 我在展示页面中列出了产品的所有相关缺陷

我想在产品展示页面中包含针对缺陷的editdelete 操作。 默认情况下,删除操作是删除产品,因为在控制器中对产品 (@product.destroy) 调用了销毁函数。如何删除选定的缺陷?

2) 为了创建缺陷,我在缺陷控制器中包含了以下 js 脚本 (create.js.erb)

   var html = "<p> <%= @product.defect.try(:defect_description) </p>"
$('#added').append(html);

这不起作用,因为两者之间的关联有很多。如何附加输入的缺陷? 我正在使用产品展示页面中的表格

这是我列出缺陷并添加的产品展示页面代码

<button class="mybtn">Defects </button>
          </div>
          <div id="clicked">
            <% if @product.defects.present? %>
          <% @product.defects.each do |defect|%>
          <p> <%= defect.try(:defect_description) %>  <%= link_to 'Delete', defect, method: :delete, data: { confirm: "Are you sure you want to delete ?"},class: "btn btn-danger btn-xs" %></td></p> 
          <% end %>
          <%= link_to "Add Defects",new_product_defect_path(@product.id),class:'btn btn-sm btn-success',remote:true%>
          <% else %>
             <p id="new_defect"> No defects found for this product </p>
              <%= link_to "Add Defects",new_product_defect_path(@product.id),class:'btn btn-sm btn-success',remote:true%>
           <%end%>
           </div>

【问题讨论】:

  • 能否添加您的显示页面代码
  • 将您的视图内容提取到一个部分,并在添加/删除时,只渲染部分。

标签: ruby-on-rails ajax ruby-on-rails-4


【解决方案1】:

products/show.html.erb

<div id="clicked">
   <%= render 'product_defects' %>
</div>

products/_product_defects.html.erb

<% if @product.defects.present? %>
    <% @product.defects.each do |defect|%>
      <p>
         <%= defect.try(:defect_description) %>
         <%= link_to 'Delete', defect, method: :delete, data: { confirm: "Are you sure you want to delete ?"},class: "btn btn-danger btn-xs" %></td>
      </p> 
    <% end %>

    <%= link_to "Add Defects",new_product_defect_path(@product.id),class:'btn btn-sm btn-success',remote:true%>
<% else %>
      <p id="new_defect"> No defects found for this product </p>
      <%= link_to "Add Defects",new_product_defect_path(@product.id),class:'btn btn-sm btn-success',remote:true%>
<% end %>

当您点击Add Defects 按钮时,将向您的DefectsController's create action 发送一个ajax 请求。您需要获取要添加缺陷的产品并渲染_product_defects.html.erb,如下所示:

缺陷/create.js.erb

$("#clicked").html("<%= render 'products/product_defects' %>");

【讨论】:

  • 我试过了,我得到一个模板丢失错误,当我检查我的服务器日志时,它显示处理创建为 js 并完成了插入,然后也显示处理显示为 js。这是为什么呢?
  • @PallaviHegde 你能添加你的完整堆栈跟踪吗?
  • 但是部分没用,我又加了代码
【解决方案2】:

要列出具有编辑/删除操作的产品的所有缺陷,在产品展示页面中,您将有如下内容:

<% @product.defects.each do |defect| %>
  <%= defect.description %>
  <%= button_to 'Edit', edit_product_defect_path(@product, defect)
  <%= button_to 'Delete', product_defect_path(@product, defect), method: :delete
<% end %>

关于已创建的缺陷,您应该有权访问该缺陷,以便相应地修改您的附加语句。

var html = "<p> <%= @defect.defect_description </p>";
html += "<%= button_to 'Edit', edit_product_defect_path(@product, defect)";
$('#added').append(html);

【讨论】:

  • 我想通过 ajax 添加一个缺陷.. 那么我如何访问该缺陷
  • 创建缺陷时,您可以访问它。当您单击链接 new_product_defect_path(@product.id) 时会发生什么。大概您会显示一个提交给缺陷控制器创建操作的表单。这就是您可以访问新缺陷的地方。
  • 好的..我试过了..但它只有在页面刷新后才被添加
  • 你有一个 id = "add" 的 div
  • 您应该发布使其工作的代码,以便其他有类似问题的人可以查看有效的解决方案。如果其中任何一个答案帮助您找到了可行的解决方案,那么如果您对它们投了赞成票,那就太好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-15
  • 1970-01-01
相关资源
最近更新 更多