Как избежать отправки параметров полей, удаленных с помощью JQuery remove () - PullRequest
0 голосов
/ 28 мая 2018

В этом коде я пытался удалить поля для nested_attributes, используя ajax :remote => ture, чтобы избежать перезагрузки всей страницы в браузере.Хотя поля в fields_for были удалены из DOM, а связь была удалена из базы данных, поля вложенных атрибутов все еще существуют в источнике страницы и выдают ошибку ActiveRecord::RecordNotFound при попытке отправить параметры для обновления действия родительской модели

рассмотрим следующий код:

_artist_form.html.erb

<%= form_for @artist do |f| %>
  <%= f.label :name %>
  <%= f.text_field :name %><br/>
  <%= f.label :style %>
  <%= f.text_field :style %><br/>

  <%= f.fields_for :songs do |song_builder|%>

    <div id = 'song_<%= song_builder.object.id %>_div'>
      <%= song_builder.label :title %>
      <%= song_builder.text_field :title %><br/>
      <%= song_builder.label :lyrics %>
      <%= song_builder.text_area :lyrics %><br/>

      <%= link_to 'Remove song', delete_song_path(:a_id => @artist.id, :s_id => song_builder.object.id),
    :method => :delete , :remote => true %>

    </div>

  <% end %>

  <%= f.submit 'Save' %>
<% end %>

rout.rb

Rails.application.routes.draw do
  ...
  delete '/artists/remove_song', :to => 'artists#delete_song', :as => :delete_song
end

application_controller.rb

class ArtistsController < ApplicationController

  def edit
    ...
  end

  def update
    @artist =  Artist.find(params[:id])

    if @artist.update(artist_params) #=> error Couldn't find Song with ID=2 for Artist with ID=2
      redirect_to artist_path(@artist)
    else
      flash[:errors] = @artist.errors.full_messages
      render :edit
    end
  end

  ...

  def delete_song
    @song_id = params[s_id]
    aritst = Artist.find(:params[a_id])
    song = artist.songs.find(@song_id)
    song.delete
    respond_to  do |format|
      format.js {render 'delete_song.js.erb'}
    end
  end

end

delete_song.js.erb

$('#song_<%= @song_id %>_div').remove() ;

Ошибка

Не удалось найти песню с идентификатором = 2 для исполнителя с идентификатором = 2

какзапретить отправку параметров удаленных полей на $(...).remove() для обновления действия?

1 Ответ

0 голосов
/ 28 мая 2018

Я пытался найти решение этой ошибки.Таким образом, согласно комментарию charlietfl, я пытался сохранить статус удаления где-то локально, тогда rails может удалить ассоциацию позже.Поэтому я изменил код следующим образом:

удалив весь код удаленного скрипта, включая файл delete_song.js.erb и действие delete_song и маршрут delete.затем я позволил пометить вложенный атрибут для удаления в файле модели Artist: accepts_nested_attributes_for :songs, :allow_destroy => true

, затем добавить кнопку удаления в _artist_form.html.erb файл следующим образом:

    <%= button_tag 'x' , :class => 'close_sign',  :type => 'button', :onclick => "$('#song_#{song_builder.object.id}_destroy').val('true'); $('#song_#{song_builder.object.id}_div').hide()" %><br/>

и скрытый файл fields_for как показано ниже:

<%= song_builder.hidden_field :_destroy, :id => "song_#{song_builder.object.id}_destroy" %>

и разрешение :songs_nested_attributes => [:title, :lyrics, :_destroy] в song_params

после удаления пользователем поля песни, оно будет скрыто и помечено для уничтожения позже

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...