Rails iOS主屏幕web应用程序 - 无法删除记录

时间:2012-11-01 13:36:43

标签: javascript ios ruby-on-rails ios6 iphone-standalone-web-app

我有一个在浏览器中完美运行的网络应用程序 - 无论是在桌面还是移动设备上。 当我尝试通过添加以下内容来解决问题时出现问题:

<meta name="apple-mobile-web-app-capable" content="yes" />

这也很有效 - 直到我需要删除应用中的记录。

我也使用了我发现的这个伟大的要点 - https://gist.github.com/1042167来阻止应用程序切换到移动游侠:

<script type="text/javascript">
    (function(document,navigator,standalone) {
        // prevents links from apps from oppening in mobile safari
        // this javascript must be the first script in your <head>
        if ((standalone in navigator) && navigator[standalone]) {
            var curnode, location=document.location, stop=/^(a|html)$/i;
            document.addEventListener('click', function(e) {
                curnode=e.target;
                while (!(stop).test(curnode.nodeName)) {
                    curnode=curnode.parentNode;
                }
                // Conditions to do this only on links to your own app
                // if you want all links, use if('href' in curnode) instead.
                if(
                    'href' in curnode && // is a link
                    (chref=curnode.href).replace(location.href,'').indexOf('#') && // is not an anchor
                    (   !(/^[a-z\+\.\-]+:/i).test(chref) ||                       // either does not have a proper scheme (relative links)
                        chref.indexOf(location.protocol+'//'+location.host)===0 ) // or is in the same protocol and domain
                ) {
                    e.preventDefault();
                    location.href = curnode.href;
                }
            },false);
        }
    })(document,window.navigator,'standalone');
</script>

我想知道这是否可以改变,因此数据方法=&#34;删除&#34;会玩得好吗?在那一刻 - 当我点击“删除&#39; - 你确定吗?&#39;确认框挂了一两秒,然后将我转回到同一个显示页面上,没有发生删除......

2 个答案:

答案 0 :(得分:0)

因此,我将根据您所写的内容假设您正在使用(捆绑的)jquery-ujs来处理您的删除链接,因为这听起来就像您正在做的那样提及data-method

ujs处理程序对删除链接的工作方式与您的预期不同。这是the jquery-ujs source的相关位:

// Handles  "data-method" on links such as:
// <a href="/users/5" data-method="delete" rel="nofollow" data-confirm="Are you sure?">Delete</a>
    handleMethod: function(link) {
      var href = rails.href(link),
        method = link.data('method'),
        target = link.attr('target'),
        csrf_token = $('meta[name=csrf-token]').attr('content'),
        csrf_param = $('meta[name=csrf-param]').attr('content'),
        form = $('<form method="post" action="' + href + '"></form>'),
        metadata_input = '<input name="_method" value="' + method + '" type="hidden" />';

      if (csrf_param !== undefined && csrf_token !== undefined) {
        metadata_input += '<input name="' + csrf_param + '" value="' + csrf_token + '" type="hidden" />';
      }

      if (target) { form.attr('target', target); }

      form.hide().append(metadata_input).appendTo('body');
      form.submit();
    },

所以你可以看到实际发生的是一个表格是动态创建的(带有所需的csrf数据),然后提交。

您链接到的要点中的委派click处理程序方法在这种情况下不起作用,因为rails js在点击带有return: false的链接时执行了data-method阻止你的处理程序被解雇的属性。

最简单的事情可能是基于ujs代码推送自己的(基于ajax的)删除处理程序。为简洁起见,我使用优秀的jQuery form plugin来处理实际的提交:

function handleDeleteLink(endpoint){
  var confirmed = confirm("Are you sure you want to delete this record?"),
    csrf_token = $('meta[name=csrf-token]').attr('content'),
    csrf_param = $('meta[name=csrf-param]').attr('content'),
    form = $('<form method="post" action="' + endpoint + '"></form>'),
    metadata_input = '<input name="_method" value="delete" type="hidden" />',
    deleteOptions = {
      beforeSubmit: function(){
        //handle ajax start
      },
      success: function(el){
        //hand success
      },
      error: function(){

      }
    };
    if (csrf_param !== undefined && csrf_token !== undefined) {
      metadata_input += '<input name="' + csrf_param + '" value="' + csrf_token + '" type="hidden" />';
    }
    if (confirmed){
      form.hide()
          .append(metadata_input)
          .appendTo('body')
          .submit(function(e){
            e.preventDefault();
            $(this).ajaxSubmit(options);
          })
          .submit();
    }
}

在您的视图中,只需将您的data-method替换为delete-link类并通过事件委派进行绑定(或者如果您愿意,可以使用不同的数据attr):

$('body')。on('click','。delete-link',function(e){   e.preventDefault();   handleDeleteLink(e.target.href); }

答案 1 :(得分:0)

问题是location.href = curnode.href;将请求更改为GET个请求,尽管我对POSTPUT请求的行为不一致。所以当你有一些路线,如:

GET     /photos             index
POST    /photos             create
GET     /photos/new         new
GET     /photos/:id/edit    edit
GET     /photos/:id         show
PUT     /photos/:id         update
DELETE  /photos/:id         destroy

updatedestroy路由最终会重新路由到show。我的hacky(希望是临时的)解决方案是为那些正在重新路由的请求创建自定义路由。所以你要添加:

match "update" => "Photos#update", :as => :update_photo
match "destroy" => "Photos#destroy", :as => :destroy_photo

我知道,我知道,这不是Rails惯例,但它应该有用。