link_to_remove_association没有删除?

时间:2015-06-21 19:59:11

标签: jquery ruby-on-rails ruby cocoon-gem

我们如何修复nested_attribute: _result_fields.html.erb ,以便当用户点击“删除”时实际删除它?而现在点击它什么也没做。

<%= f.text_field :result_value, class: 'form-control', placeholder: 'Enter Result' %>
<%= f.date_select :date_value, :order => [:month, :day, :year], :with_css_classes => true, :class => "date-select" %>
<%= f.check_box :bad %>
<%= link_to_remove_association f do %>
  Delete
<% end %>

统计has_many结果

统计/ _form

<div id="results">
  <%= f.fields_for :results do |result| %>
  <%= render 'result_fields', :f => result %>
  <% end %>
</div>

  <span class="label label-primary">
    <%= link_to_add_association f, :results do %>
    <span class="glyphicon glyphicon-plus"></span> Result
    <% end %>
  </span>

stats_controller 中我将此作为参数:results_attributes: [:id, :result_value, :date_value, :bad, :_destroy]

模型

class Stat < ActiveRecord::Base
  has_many :results
  accepts_nested_attributes_for :results, :reject_if => :all_blank, :allow_destroy => true
end

class Result < ActiveRecord::Base
  belongs_to :stat
end

我正在使用cocoon gem

如果您需要进一步的代码或解释,请与我们联系。谢谢!

BY REQUEST

class StatsController < ApplicationController
  before_action :set_stat, only: [:show, :edit, :update, :destroy, :like]
  before_action :logged_in_user, only: [:create, :destroy]
  before_action :correct_user, only: [:edit, :update, :destroy]

  def index
    if params[:tag]
      @stats = Stat.tagged_with(params[:tag])
    else
      @stats = Stat.joins(:results).all
      @averaged_stats = current_user.stats.averaged
      @instance_stats = current_user.stats.instance
    end
  end

  def show
    @stat = Stat.find(params[:id])
    @commentable = @stat
    @comments = @commentable.comments
    @comment = Comment.new
    @notable = @stat
    @notes = @notable.notes
    @note = Note.new
    @correct_user = current_user.stats.find_by(id: params[:id])
  end

  def new
    @stat = current_user.stats.build 
  end

  def edit
  end

  def create
    @stat = current_user.stats.build(stat_params)
    if (params[:commit] == 'conceal')
      @stat.conceal = true
      @stat.save
      redirect_to @stat, notice: 'Stat was successfully created'
    elsif
      @stat.save
      track_activity @stat
      redirect_to @stat, notice: 'Stat was successfully created'
    else
      flash.now[:danger] = 'Required Fields: "Averaged or Instance", "Enter Action", "Enter Metric", and "+ Result"'
      render 'new'
    end
  end

  def update
    if @stat.update(stat_params)
      redirect_to stats_url, notice: 'Goal was successfully updated'
    else
      render action: 'edit'
  end
end

  def destroy
    @stat.destroy
    @result.destroy
    redirect_to stats_url
  end

  def like
    @stat = Stat.find(params[:id])
    @stat_like = current_user.stat_likes.build(stat: @stat)
    if @stat_like.save
      @stat.increment!(:likes)
      flash[:success] = 'Thanks for liking!'
    else
      flash[:error] = 'Two many likes'
    end  
      redirect_to(:back)
  end

  private
    def set_stat
      @stat = Stat.find(params[:id])
    end

    def correct_user
      @stat = current_user.stats.find_by(id: params[:id])
      redirect_to root_url, notice: "Not authorized to edit this stat" if @stat.nil?
    end

    def stat_params
      params.require(:stat).permit(:categories, :like, :action, :metric, :date, :comment, :private_submit, :tag_list, results_attributes: [:id, :result_value, :date_value, :bad, :_destroy])
    end
end

stat.js

$( document ).ready(function() {
  $('.date-format-switcher').click(function(event){
    event;
    if ($(this).attr('id') == 'stat_categories_instance') {
      $('.day').show();
     } else if ($(this).attr('id') == 'stat_categories_averaged') {
        $('.day').hide();
    }
})
  $('.add-form-padding').on('cocoon:after-insert', function(e, insertedItem) {
    if($('#stat_categories_instance').is(':checked')) {
      $('.day').show();
    } else {
        $('.day').hide();
    }
})
});

2 个答案:

答案 0 :(得分:22)

如果link_to_add_association有效,则javascript正确加载。

对于什么不起作用仍然有点困惑。如果点击link_to_remove_association没有从页面中删除任何内容,那么您就错过了正确的包装类。默认情况下,它应为.nested-fields,但可以通过明确指定(documented)来推翻。

但如果项目被视觉删除,并且您认为它应该立即发送到服务器,那么您就会误解cocoon的工作原理:您编辑一个表单,该表单仅在您提交表单时保存(发送到服务器) 。因此link_to_remove_association仅可见,删除嵌套子项,并编辑表单的内容(设置_destroy标志),因此在保存/提交表单时,嵌套的子项将被删除。

答案 1 :(得分:3)

也许问题是你没有包含gem附带的javascript以便按预期调用链接,你是否在rails 3或4上使用ruby?在轨道上提问时,这非常重要,因为它们差别很大

检查位于application.js的{​​{1}}文件,并确保添加此行:

app/assets/application.js

如果你已经添加了资产,请检查页面的源代码,并确认在页面中加载了为cocoon定义的javascript

如果已经完成,请更新问题并添加您在单击链接时看到的rails日志,并告诉我您使用的是哪个版本的rails