如何避免使用JQuery remove()

时间:2018-05-28 00:35:01

标签: javascript jquery ruby-on-rails ruby activerecord

在这段代码中,我试图使用ajax :remote => ture删除nested_attributes的文件以避免重新加载 浏览器中的整个页面。虽然fields_for中的文件已从DOM中删除,但关联已从数据库中删除,但嵌套属性的字段已删除 仍然存在于页面源中并在尝试发送params以更新父模型

的操作时引发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 %>

的routes.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() ;

错误

  

对于ID = 2的艺术家

,找不到ID为2的歌曲

如何阻止$(...).remove()发送删除字段的参数以更新操作?

1 个答案:

答案 0 :(得分:0)

我试图找到这个错误的解决方案。所以根据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

一旦用户删除了歌曲字段,它将被隐藏并标记为稍后销毁