`

rails3的删除问题

    博客分类:
  • ruby
阅读更多
Rails 3所做的很大一个改进就是:Unobtrusive JavaScript(非侵入式的JavaScript),以实现对HTML和JavaScript代码的分离。比如:
 
<%= 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了。

经过上面两步以后,删除回到原来的分页位置就可以解决了。
分享到:
评论
6 楼 be_a_coder 2010-12-20  
非常赞,最近正在学习rails其中就遇到了这个问题,
这些问题不知道的时候还真是摸不着头脑。
多谢老兄分享   
5 楼 charm 2010-11-27  
删除跟其它的都一样,respond_with @user, :location => **_path
4 楼 solacky 2010-11-10  
我记得在IE中用Link_to删除还是会有问题,在FF 里没事。

逼急了,直接用Button_to。
3 楼 下一站,火星 2010-10-01  
这种删除一般是利用ujs实现 "ajax"删除
2 楼 fansofjava 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


1 楼 javy_liu 2010-09-28  
使用 csrf_meta_tag 以后能解决ie 浏览器的问题么?

现在有80%的人还在使用ie6呢!

相关推荐

    Rails3常用命令行命令

    Rails3 是 Ruby on Rails 框架的一个版本,它提供了一系列强大的命令行工具,使得开发者可以快速地构建和管理Web应用。在本文中,我们将深入探讨Rails3中的常用命令,帮助你更高效地进行开发工作。 首先,新建一个...

    centOS Rails3环境搭建

    ### CentOS环境下Rails 3开发环境搭建详解 #### 一、准备工作与环境配置 在开始部署Rails 3开发环境之前,我们需要确保系统上已经安装了一些基本的软件包和工具。这一步骤对于后续的Ruby和Rails安装至关重要。 ##...

    Rails 3 in Action

    ### Rails 3 in Action 关键知识点解析 #### 一、Ruby on Rails 框架简介 **Rails 3 in Action** 这本书介绍了 **Ruby on Rails**(简称 Rails)这一 Web 开发框架的核心概念和技术细节。Rails 自发布以来便以其...

    Ruby Rails 3 Linda

    在“Ruby Rails 3 Linda”这一主题中,我们将会深入探讨Rails 3版本的相关知识点。 1. **安装与设置**:首先,学习如何在本地环境中安装Ruby、RubyGems和Rails。Ruby版本管理器如RVM(Ruby Version Manager)或...

    Rails101_by_rails4.0

    此外,书中还介绍了一些Rails中的高级概念,如Strong Parameters(强参数),它在Rails 4.0版本中引入,用于解决之前版本中的参数篡改问题,从而帮助开发者安全地处理外部提交的数据。 通过一系列的教学内容,包括...

    Rails 101 入门电子书

    - Delete (删除): 删除Group。 - **RESTful设计**: - 理解RESTful架构的原则。 - 实现RESTful风格的接口。 - **代码示例**: - 创建GroupsController类。 - 实现每个动作的方法。 #### 八、补充章节:RESTful ...

    rails2.3.2

    3. ActiveSupport:提供了一系列实用的工具和扩展,如时间处理、字符串操作、日历计算等,增强了 Ruby 语言的基础功能。 4. 插件和Gem:Rails 2.3.x 支持 Gem 管理系统,允许开发者通过安装和管理第三方 Gem 来扩展...

    Rails相关电子书汇总

    6. **Scaffold**:快速开发工具,可以自动生成用于CRUD(创建、读取、更新、删除)操作的基本控制器、模型和视图。 7. **Gemfile和Bundler**:Rails项目通过Gemfile管理依赖,Bundler工具确保在开发环境中安装正确...

    rails敏捷开发的购物车系统

    在本文中,我们将深入探讨如何使用Rails敏捷开发技术构建一个购物车系统,特别是在参考《rails敏捷开发第四版》中的示例。Rails 3.2.6是本文的基础框架,它是一个强大的Ruby Web应用程序框架,以其MVC(模型-视图-...

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    - **回滚**:如果更新后出现问题,可以通过`git`命令或者手动修改`Gemfile`来回滚到之前的版本。 #### 六、添加第二个路由 - **配置**:在`config/routes.rb`文件中添加新的路由规则,例如`get 'new_route' =&gt; '...

    Rails 101S

    ### Rails 101S: 初学者必备的Ruby on Rails 宝典 #### Introduction: 深入了解Ruby on Rails 《Rails 101S》是一本为Ruby on Rails初学者准备的手册,旨在帮助新手快速入门并掌握基本的开发技能。本手册将从最...

    rails 项目起步示例

    3. **config**:配置文件的集合,包括数据库连接、路由设置、应用环境等。 4. **db**:数据库相关的文件,如迁移(migrations)用于数据库结构的版本控制。 5. **lib**:自定义库和扩展代码存放的地方。 6. **log...

    Ruby on Rails入门例子

    4. 实现CRUD操作:展示所有文章(index),新建文章(new),编辑文章(edit),保存或更新文章(create/update),删除文章(destroy)。 5. 测试:使用RSpec或MiniTest进行功能测试和集成测试,确保应用正常工作。...

    rails-api-4.0.0

    API应该提供清晰的错误信息,以便客户端能够理解问题所在。可以通过rescue_from或自定义异常类来捕获和处理错误。 七、安全与认证: API的安全性至关重要。常见的安全策略包括OAuth2、JWT(JSON Web Tokens)或API...

    rails学习教程

    Rails的scaffolding功能能快速生成一个基本的CRUD(创建、读取、更新、删除)应用界面,是快速原型开发的好帮手。 九、Rails的安全性 Rails提供了许多安全特性,如CSRF防护、XSS防护和参数过滤。了解这些安全措施并...

    rails cookbook

    《Rails Cookbook》是一本专注于Ruby on Rails框架的实用指南,旨在帮助开发者解决在开发过程中遇到的具体问题和挑战。Rails作为一款强大的Web应用框架,以其MVC(模型-视图-控制器)架构和“约定优于配置”的设计...

    Ruby+for+Rails

    例如,`resources :books`会生成CRUD(创建、读取、更新、删除)相关的路由。 8. **ActiveRecord** Rails的ORM(对象关系映射)层,允许开发者用Ruby对象操作数据库。每个模型类对应数据库表,实例方法对应SQL查询...

    好用的rails 2.0 Api 文档

    Active Record提供了许多便捷的方法,如CRUD(创建、读取、更新、删除)操作,以及关联(如has_many、belongs_to等)。 **3. RESTful设计** Rails鼓励使用REST(Representational State Transfer)架构风格来构建...

    rails向导打包

    3. **深入浅出说路由**: 路由是 Rails 应用的心脏,定义了 URL 如何映射到控制器的行动。文件会讲解 `resources`、`resource` 和自定义路由的基本用法,以及如何设置命名路由、约束和参数。 4. **Rails 数据库迁移...

Global site tag (gtag.js) - Google Analytics