Ссылка на удаленное уничтожение не обновляет div

Я создал представление, которое показывает все мои продукты-счета, а также создал ссылку, которая удаляет продукт-счет из div, и он будет обновляться, поэтому каждый раз, когда я удаляю, все будет на одной странице.

Вот таблица

invoices
  |id|  |name|
    1    ABC
    2    DEF

invoice_products
  |id|  |invoice_id|  |word|
    1      1           AAAA
    2      1           BBBB 
    3      2           CCCC   
    4      2           DDDD

Вот контроллер:

def show
   @invoice= Invoice.find(params[:id])
end

def destroy_job
   @job = InvoiceProduct.find(params[:id])
   @invoice = @job.invoice
   @job.destroy()

   render :partial=>"finance_management/invoice/partials/new_subjects" }
end

Вот модель

class Invoice < ActiveRecord::Base
  has_many   :invoice_products
end

class InvoiceProduct < ActiveRecord::Base
  belongs_to :invoice
end

Вот вид: "show.html.erb"

<%= @invoice.id %>

<div id="table"%>
<% @invoice.invoice_products.each do |i| %>
   <%= i.name %>
   <%= i.word %>
   <%=link_to_remote(image_tag("image.png"), :update => "table",:url => { :controller=>'finance_management/invoice_product',:action => 'destroy_job',:id=>i.id }  )%>
<% end %>
</div>

Журнал:

ActionView::TemplateError (undefined method `invoice_products' for nil:NilClass)

Я создал "delete_job.js.erb":

$('table').html("<%= j(render partial: 'finance_management/invoice/partials/new_subjects') %>");

Но я получил эту ошибку:

NoMethodError (undefined method `invoice_products=' for nil:NilClass):

Проблема в том, что не обновляется div, потому что появляется ошибка nil

Кто-нибудь может мне помочь?


person Carlos Morales    schedule 07.07.2014    source источник
comment
Если я правильно понимаю, вы пытаетесь удалить счет-фактуру из счета-фактуры.   -  person Marko Jurinčič    schedule 07.07.2014
comment
1. Вы отправляете invoice.id и ищете внутри invoiceproducts. 2.Название действия delete_new_job vs destroy_job (или вы вызываете разные контроллеры)? 3. Вы рендерите партиал, но я думаю, что вы не устанавливаете объект инвойсов. Попробуйте создать фильтр before_filter, в котором вы задаете массив инвойсов, и он подойдет для всех действий.   -  person Marko Jurinčič    schedule 07.07.2014
comment
Хорошо.... Я сделал 1, 2, но не понимаю вашего варианта 3... не могли бы вы проверить код еще раз, пожалуйста?   -  person Carlos Morales    schedule 07.07.2014
comment
ActionView::TemplateError (неопределенный метод `invoice_products' для nil:NilClass), поэтому массив счетов не установлен. Попробуйте также добавить @invoices= Invoice.all в свой метод уничтожения, просто чтобы посмотреть, работает ли он.   -  person Marko Jurinčič    schedule 07.07.2014
comment
Я пытался, но все еще не работает   -  person Carlos Morales    schedule 07.07.2014
comment
Как насчет того, чтобы показать нам исходный код вашего партиала? Я думаю, что Марко на верном пути.   -  person Finks    schedule 07.07.2014
comment
Хорошо, я отредактировал пост, добавив то, что пробовал   -  person Carlos Morales    schedule 07.07.2014


Ответы (2)


В соответствии с этим вы должны сделать это:

Контроллер invoice_controller.rb:

def show
  @invoice= Invoice.find(params[:id])
  @products = InvoiceProduct.find(:all,:conditions=>['invoice_id = ?',params[:id] ])
end

def destroy_job
  @job = InvoiceProduct.find(params[:id])
  @obj_invoice = Invoice.find(@job.invoice_id)    
  @job.destroy
end

Представление "invoice/show.html.erb"

<%= @invoice.id %>
<div id="table"%>
  <%= render :partial=>"invoice/partials/products" %>
</div>

Не забудьте создать частичное представление "invoice/partials/_products.erb", это заменит div

 <% @products.each do |i| %>
    <%= i.name %>
    <%= i.word %>
   <%=link_to_remote(image_tag("image.png"),:url=>{:controller=>'invoice',:action => 'destroy_job',:id=>i.id})%>
 <% end %>

Наконец создайте "invoice/destroy_job.rjs"

 page.replace_html 'table', :partial=>'invoice/partials/products'
person Charlie Brown    schedule 08.07.2014

Создайте файл «destroy_job.js.erb» и поместите метод рендеринга внутри этого файла вместо вызова его в контроллере:

$('YOUR_ID').html("<%= j(render partial: 'finance_management/invoice/partials/new_subjects') %>");
person maricavor    schedule 08.07.2014
comment
Хорошо, я попробовал $('table').html(‹%= j(partial render: 'finance_management/invoice/partials/new_subjects') %›); и получил ActionView::TemplateError (неопределенный метод `invoice_products' для 1:Fixnum) - person Carlos Morales; 08.07.2014
comment
Так что проблема была не в рендеринге, а в методе 'invoice_product'. Для какой строки кода отображается эта ошибка? - person maricavor; 08.07.2014
comment
Когда вы визуализируете партиал, передайте также объект @invoice, например: render :partial=>"finance_management/invoice/partials/new_subjects", :invoice=>@invoice Что на самом деле находится внутри партиала 'new_subjects'? - person maricavor; 08.07.2014