link_to_remove_association 没有删除?
link_to_remove_association is not removing?
我们如何修复 nested_attribute: _result_fields.html.erb 以便当用户单击 "Delete" 时它实际上会被删除?而现在点击它什么都不做。
<%= 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
结果
stats/_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。
如果您需要进一步的代码或解释,请告诉我。谢谢!
根据要求
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();
}
})
});
也许问题在于您没有包含 gem 附带的 javascript 以便按预期调用 links,您使用的是 ruby 在 rails 上 3 或 4?在 rails 中提问时,这一点非常重要,因为它们差异很大
检查位于 app/assets/application.js
中的 application.js
文件并确保添加了以下行:
//= require cocoon
如果您已经添加了资产,请检查页面的源代码,并请确认页面中正在加载为 cocoon 定义的 javascript
如果已经完成,请更新问题并添加您在单击 link 时看到的 rails 日志,并让我知道 rails 的版本您正在使用
如果 link_to_add_association
有效,则 javascript 已正确加载。
仍然对什么不起作用感到困惑。如果单击 link_to_remove_association
没有从页面上 删除 任何可见的内容,则您缺少正确的包装器 - class。默认情况下它应该是 .nested-fields
,但是可以通过明确指定它来否决它(如 documented)。
但是如果项目在视觉上被删除,并且您认为应该立即将其发送到服务器,那么您就误解了 cocoon 的工作原理:您编辑了一个表单,该表单仅在您提交时保存(发送到服务器)表格。所以 link_to_remove_association
only visible 删除嵌套子项,并编辑表单的内容(设置 _destroy
标志),所以当 saving/submitting 表单时,嵌套子项将被删除。
我们如何修复 nested_attribute: _result_fields.html.erb 以便当用户单击 "Delete" 时它实际上会被删除?而现在点击它什么都不做。
<%= 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
结果
stats/_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。
如果您需要进一步的代码或解释,请告诉我。谢谢!
根据要求
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();
}
})
});
也许问题在于您没有包含 gem 附带的 javascript 以便按预期调用 links,您使用的是 ruby 在 rails 上 3 或 4?在 rails 中提问时,这一点非常重要,因为它们差异很大
检查位于 app/assets/application.js
中的 application.js
文件并确保添加了以下行:
//= require cocoon
如果您已经添加了资产,请检查页面的源代码,并请确认页面中正在加载为 cocoon 定义的 javascript
如果已经完成,请更新问题并添加您在单击 link 时看到的 rails 日志,并让我知道 rails 的版本您正在使用
如果 link_to_add_association
有效,则 javascript 已正确加载。
仍然对什么不起作用感到困惑。如果单击 link_to_remove_association
没有从页面上 删除 任何可见的内容,则您缺少正确的包装器 - class。默认情况下它应该是 .nested-fields
,但是可以通过明确指定它来否决它(如 documented)。
但是如果项目在视觉上被删除,并且您认为应该立即将其发送到服务器,那么您就误解了 cocoon 的工作原理:您编辑了一个表单,该表单仅在您提交时保存(发送到服务器)表格。所以 link_to_remove_association
only visible 删除嵌套子项,并编辑表单的内容(设置 _destroy
标志),所以当 saving/submitting 表单时,嵌套子项将被删除。