带有Rails的format.js.

时间:2009-08-12 19:59:36

标签: jquery ruby-on-rails

所以我有我的销毁命令。问题是我不希望我的用户能够删除此类别,如果它包含项目。所以我的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文件,但该警报无论是否被删除都会触发。我确信有更好的解决方案可以做到这一切,但我不知道。

2 个答案:

答案 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上找到更多信息。