在这段代码中,我试图使用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()
发送删除字段的参数以更新操作?
答案 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
一旦用户删除了歌曲字段,它将被隐藏并标记为稍后销毁