所以我有我的销毁命令。问题是我不希望我的用户能够删除此类别,如果它包含项目。所以我的destroy方法中有一个if语句。这很好用,但是我使用AJAX来加载页面并使用destroy.js.erb文件。我的方法如下:
def destroy
@promotion_type = PromotionType.find(params[:id])
if Promo.find_by_promotion_type_id(params[:id]).nil?
@promotion_type.destroy
respond_to do |format|
format.html { redirect_to(promotion_types_url) }
format.js {render :layout => false }
format.xml { head :ok }
end
else
respond_to do |format|
format.js {}
end
end
end
这是我的javascript(jquery):
$('a.delete').click (function(){
if(confirm("Are you sure?")){
var row = $(this).closest("tr").get(0);
$.post(this.href, {_method:'delete'}, null, "script");
$(row).hide();
return false;
} else {
//they clicked no.
return false;
}
我的一个问题是,一旦他们点击是,它就会隐藏行并且AJAX会删除它。如果我没有隐藏它,它将被删除,但由于页面没有刷新,看起来它没有删除,所以我隐藏它的效果。这个解决方案的唯一问题是当我到达我的类别时。如果内部有项目,我不希望用户删除它。我不能在我的javascript文件中抛出ruby代码,我不能(或者不知道某种方式)将javascript变量或$(this)抛出到.js.erb文件中。
代码在大多数情况下都能正常运行,但即使它无法删除它,它也会立即隐藏该行。所以我要发出警告('不能删除');进入我的.js.erb文件,但该警报无论是否被删除都会触发。我确信有更好的解决方案可以做到这一切,但我不知道。
答案 0 :(得分:2)
如同geowa4所说,你可以做以下事情
$('a.delete').click (function(){
if(confirm("Are you sure?")){
var row = $(this).closest("tr").get(0);
$.post(
this.href,
{_method:'delete'},
function(data){$(row).hide();},
"script"
);
// Move from here to the callback
//$(row).hide();
return false;
} else {
//they clicked no.
return false;
}
}
作为替代方案,您可以简单地在.js.erb文件中使用JS“隐藏”代码以及警报。您还需要将变量(@destroyed)传递给erb,然后使用if语句进行天气以基于@destroyed变量触发警报。
def destroy
@promotion_type = PromotionType.find(params[:id])
if Promo.find_by_promotion_type_id(params[:id]).nil?
@deleted = true
@promotion_type.destroy
respond_to do |format|
format.html { redirect_to(promotion_types_url) }
format.js {render :layout => false }
format.xml { head :ok }
end
else
@deleted = false
respond_to do |format|
format.js {}
end
end
end
答案 1 :(得分:1)
为什么不根据它是否被删除而返回true或false?在$.post
中定义回调来处理此问题。
$.post(yourURL, yourDATA, function(data){ myCallback(data); }, "text");
function myCallback(data) {
if( data === "true" )
...
else
...
}
我使用“text”作为演示的响应格式。你可能想要更像“json”的东西。您拥有的“脚本”格式会将您的回复视为javascript;因为你说你是从某个地方复制过的,所以我不认为你真正需要的是什么。 IMO,返回的内容应该只是数据,因为你得到的是“xml”,“text”或“json”格式。您可以在jQuery docs page上找到更多信息。