【发布时间】:2018-05-28 00:35:00
【问题描述】:
在这段代码中,我试图使用 ajax :remote => ture 删除nested_attributes 的文件以避免重新加载
浏览器中的整个页面。尽管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 %>
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
删除_song.js.erb
$('#song_<%= @song_id %>_div').remove() ;
错误
无法为 ID=2 的艺术家找到 ID=2 的歌曲
如何防止$(...).remove()发送已删除字段的参数以更新操作?
【问题讨论】:
-
如果用户删除它们,您需要在某处存储状态。如果您将其存储在本地,则必须使用 ajax 请求发送它以加载更多内容。或者存储服务器端需要在元数据被删除时发出请求并存储每个用户服务器端然后相应地过滤新请求
标签: javascript jquery ruby-on-rails ruby activerecord