浏览 4492 次
锁定老帖子 主题:rails3的删除问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-08-25
最后修改:2010-09-13
<%= link_to "Destroy", @product, :confirm => "Are you sure?", :method => :delete %> 将转换成: <a href="/products/8" data-confirm="Are you sure?" data-method="delete" rel="nofollow">Destroy</a> 不再有多余的js代码,不过那个data-是html5的元素,因此这段代码要跑起来还是有点困难的。在windows上,点击destroy会跳到show的action中去。引用: 引用 The reason that the link isn’t working is that we don’t have the relevant JavaScript files referenced in the head section of the page so the link will behave as a standard link and perform a GET request as there’s nothing telling it to do otherwise. 也就是说浏览器把它当做get方法处理了。在linux ubuntu下,虽然执行了delete操作,但是没有authenticity_token元素,会被认为是CSRF攻击,因此会抛出InvalidAuthenticityToken异常。这个问题让我想起过加skip_before_filter :verify_authenticity_token,但是这明显不是好的方式,也试着改一下request.forgery_whitelisted?方法,虽然也能解决问题,但更加的不好。无意间在网上看见了一种处理方式,这种方式应该是标准的解决方案了吧。 解决方式很简单,在layouts目录下的模板文件的头部加上: <%= javascript_include_tag :defaults %> <%= csrf_meta_tag %> 一般第一句是有的,只是缺少第二句。看看csrf_meta_tag源码: def csrf_meta_tag if protect_against_forgery? %(<meta name="csrf-param" content="#{Rack::Utils.escape_html(request_forgery_protection_token)}"/>\n<meta name="csrf-token" content="#{Rack::Utils.escape_html(form_authenticity_token)}"/>).html_safe end end 相应的html代码与下面类似: <meta name="csrf-param" content="authenticity_token"/> <meta name="csrf-token" content="WO8dau2vScU/ad3JKLh2jRdSm7N8QEdNfX3ggGawxOE="/> 这段代码主要解决的就是csrf的问题。在原来的rails2中,通过js创建一大段代码来提交删除操作,提交方式为post,其中就有这个隐藏字段,所以原因是可能没有这个不能识别到delete操作吧。 虽然这个问题就这样解决了,但有些困惑的是,在windows下与linux居然表现出不同的行为,用的firefox都是3.6.8的,rails3rc版本也是一样的,只有ruby一个是187,一个是192,难道对ruby解析器有关? 后记(2010.9.2),最近突然相起,分页的时候删除操作也应该进行相应的处理,如在第三页删除某条记录,那么删除之后也应该回到第3页。这个问题分页插件并没有进行相应的处理,因此只能自己做。 在rails3中,本人使用的是: gem "will_paginate", "3.0.pre2" 这个插件非常使用简单,功能强大,比我见过的所有java分页插件都好。怎么使用可参照官网,很简单的。下面讲一下怎么处理删除之后又回到原来的那一页。 仔细观察了一下,分页就是通过page参数实现的,只要在删除时将page参数传过去,应该就可以解决问题。于是删除时加上page参数: <%= link_to 'Destroy', user_path(user,:page=>params[:page]),:confirm => 'Are you sure?', :method => :delete %> 这样删除链接就会加上page=..多少的参数了。但是这样还没完,因为删除之后会进行查询操作。上面的操作只是把page参数传进destroy方法了,但是并没有传送到index方法去。 由于本人对rails的了解还比較浅,因此简单一点,再传一次。 respond_with(@user) do |format| format.html { redirect_to(:action=>"index",:page=>params[:page]) } end 试一下,respond_with不知道该怎么传参数过去,文档上也没说,网上也没找到这么用的,因此只能用redirect_to了。 经过上面两步以后,删除回到原来的分页位置就可以解决了。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-09-28
使用 csrf_meta_tag 以后能解决ie 浏览器的问题么?
现在有80%的人还在使用ie6呢! |
|
返回顶楼 | |
发表时间:2010-09-28
最后修改:2010-09-28
andyxl0315 写道 最近突然相起,分页的时候删除操作也应该进行相应的处理,如在第三页删除某条记录,那么删除之后也应该回到第3页。这个问题分页插件并没有进行相应的处理,因此只能自己做。
在rails3中,本人使用的是: ===========================================引用======================== 如果当前是第3页 。 第三页只有1条数据,现在把数据删除了,跳转到第三页什么都看不到。 redirect_to :back 等价于 redirect_to(:action=>"index",:page=>params[:page]) 看了下文档,原来还有:back这个东西,多谢提醒! 这样的话可以很简单了: def destroy @user = User.find(params[:id]) @user.destroy respond_with(@user,:location=>:back) end |
|
返回顶楼 | |
发表时间:2010-10-01
这种删除一般是利用ujs实现 "ajax"删除
|
|
返回顶楼 | |
发表时间:2010-11-10
我记得在IE中用Link_to删除还是会有问题,在FF 里没事。
逼急了,直接用Button_to。 |
|
返回顶楼 | |
发表时间:2010-11-27
删除跟其它的都一样,respond_with @user, :location => **_path
|
|
返回顶楼 | |
发表时间:2010-12-20
非常赞,最近正在学习rails其中就遇到了这个问题,
这些问题不知道的时候还真是摸不着头脑。 多谢老兄分享 |
|
返回顶楼 | |