我有一个在浏览器中完美运行的网络应用程序 - 无论是在桌面还是移动设备上。 当我尝试通过添加以下内容来解决问题时出现问题:
<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;确认框挂了一两秒,然后将我转回到同一个显示页面上,没有发生删除......
答案 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
个请求,尽管我对POST
和PUT
请求的行为不一致。所以当你有一些路线,如:
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
update
和destroy
路由最终会重新路由到show
。我的hacky(希望是临时的)解决方案是为那些正在重新路由的请求创建自定义路由。所以你要添加:
match "update" => "Photos#update", :as => :update_photo
match "destroy" => "Photos#destroy", :as => :destroy_photo
我知道,我知道,这不是Rails惯例,但它应该有用。