【问题标题】:How to avoid sending params of fields deleted using JQuery remove()如何避免发送使用 JQuery remove() 删除的字段的参数
【发布时间】: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


【解决方案1】:

我试图找到解决此错误的方法。所以根据charlietfl的评论,我尝试将删除状态存储在本地某个地方,然后rails可以稍后删除关联。所以我修改了代码如下:

删除所有远程脚本代码,包括delete_song.js.erb 文件和delete_song 操作和delete 路由。然后我允许在 Artist 模型文件中将嵌套属性标记为删除: accepts_nested_attributes_for :songs, :allow_destroy =&gt; 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 =&gt; [:title, :lyrics, :_destroy] 进入song_params

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多