`
zcbbupt
  • 浏览: 60181 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Rails中的link_to方法注意点

阅读更多
转自:http://www.blogjava.net/pengpenglin/archive/2010/05/17/321193.html

link_to是Rails中提供的一个内置方法,用于产生一个超链接,常用的方法通常是link_to "链接文字", options = {}, html_options = {}, 如果我们不指定提交的方法,默认情况下将产生一个HTTP GET请求,但是我们也可以通过指定提交方法来避免某些敏感数据的泄漏。

在《Agile web development with Rails》一书中,有这样一个练习题:为购物网站上面的图片添加一个超链接,当点击该图片时请求名为store的controller下add_to_cart action,同时要求使用POST方式来请求。代码如下所示:
<%= link_to image_tag(product.image_url),  options = {:action => "add_to_cart"},  html_options={:method => "post"} %> 


其中第一个参数image_tag是一个内置方法,用于产生一个的HTML标签,而options接受一个hash容器,在这个容器中只有一个参数action,它告诉了请求对应的action,于是rails会在构建<a>表情的href属性时将其转换为:http:localhost:3000/store/add_to_cart 这种形式:即请求StoreController下的add_to_cart方法。最重要的一定是html_options参数,它也接受一个hash容器,通过method="post"来告诉浏览器,采用post方式来提交请求。

但是我们知道post通常是在form中才用到的,这里并没有form的定义,那么是如何采用post方式来进行提交的呢?通过阅读浏览器解析后的源代码,我们可以发现rails在编译期间做了很巧妙的处理:它创建了一个动态的、隐藏的表单来提交:
[url=/store/add_to_cart]<img alt="Auto" src="/images/auto.jpg?1265130093" />[/url] 


下面就是onClick的内容:
  //创建一个隐式的表单对象,并设置提交方式为POST,已经设置提交的URL
  var f = document.createElement('form');  
  f.style.display = 'none'; 
  this.parentNode.appendChild(f); 
  f.method = 'POST'; 
  f.action = this.href;

  //为表单添加一个隐藏域,指定提交的方式参数
  var m = document.createElement('input'); 
  m.setAttribute('type', 'hidden'); 
  m.setAttribute('name', '_method'); 
  m.setAttribute('value', 'post');
  f.appendChild(m);
  
  //为表单添加一个隐藏域,指定当前的Session token key,防止重复提交
  var s = document.createElement('input'); 
  s.setAttribute('type', 'hidden'); 
  s.setAttribute('name', 'authenticity_token'); 
  s.setAttribute('value', '6c02dccc61c8e299bf1765bd0414355e9d8a4815'); 
  f.appendChild(s);
  
  //动态提交表单
  f.submit();
  
  return false;"
}


这就是采用post方式提交请求的“秘密”,rails的实现相当优雅!可是如果我们把上面的link_to代码稍微改一下,如下面所示,会有什么结果呢?

<%= link_to image_tag(product.image_url),  {:action => "add_to_cart", :method => "post"} %>


我们来看看最终产生的页面源代码

[url=/store/add_to_cart?method=post]<img alt="Auto" src="/images/auto.jpg?1265130093" />[/url]

很明显,method=post变成了URL的请求参数,而不是HTTP 请求报头了。也就是说这里产生的是一个HTTP GET请求:http://localhost:3000/store/add_to_cart?method=post,而正确的请求应该是:http://localhost:3000/store/add_to_cart

所以我们一定要记住:options={}是用来传递请求参数的,而html_options={}是用来设置请求报头的,不能搞混!
分享到:
评论

相关推荐

    Rails link_to 详解

    例子: 代码: &lt;&#37;= link_to “Issues”, {:controller =&gt; “issue”, :action =&gt; “index”}, {:title...”} %&gt; 但是值得注意的就是,link_to 的第二个参数,必须是以 map 的形式给出,才能达到这样的效果。link_t

    link_to_active_state:一个简单的gem,使用标准的Rails link_to helper在链接上实现活动状态

    一个简单的gem,可以使用标准的Rails link_to helper在链接上实现活动状态。 这对导航列表或按钮有帮助,当当前URL匹配链接帮助器上的条件时,为他们提供一个类。 安装 将此行添加到您的应用程序的Gemfile中: gem...

    inspinia admin - v2.5 Rails_Full_Version

    当你解压"Rails_Full_Version"并开始开发时,可以参考这些知识点逐步构建和定制你的后台管理系统。务必保持代码整洁,遵循DRY(Don't Repeat Yourself)原则,以实现高效且可扩展的代码。同时,不断学习和研究新的...

    rails_semantic_logger, Rails 语义记录器用语义记录器替换 Rails 缺省记录器.zip

    rails_semantic_logger, Rails 语义记录器用语义记录器替换 Rails 缺省记录器 Rails 语义记录器 语义记录器用语义记录器替代 Rails 缺省记录器。http://github.com/rocketjob/rails_semantic_logger文档有关完整文档...

    rails_apps_composer, 一个 gem,为 Rails 启动应用程序创建 Rails 应用程序模板.zip

    rails_apps_composer, 一个 gem,为 Rails 启动应用程序创建 Rails 应用程序模板 Rails 应用编辑器 Rails 应用程序编辑器 gem 安装一个 命令行 工具来从"食谱"的Collection 组装 Rails 应用程序。"你可以使用 rails_...

    InspiniaAdmin 2.6.1 Rails_Full_Version

    在Rails_Full_Version压缩包中,包含了完整的源代码和必要的资源文件,开发者可以通过解压并导入到Rails项目中,按照官方文档进行配置和定制。同时,这个版本可能还包含了升级记录、更改日志和可能的bug修复,以保证...

    RestFul_Rails_Dev_pdf_v_0.1.zip

    本资料“RestFul_Rails_Dev_pdf_v_0.1.zip”包含了《RESTful Rails Development》的翻译版,将深入探讨如何在Rails中实现RESTful的设计模式。 首先,RESTful设计的核心概念是资源(Resources)。在Rails中,资源...

    agile_web_development_with_rails_3rd_edition.9994652073.pdf

    《敏捷Web开发与Rails》第三版是一本深入探讨Ruby on Rails框架在敏捷软件开发方法论下的应用指南。本书由多位知名作者共同编写,包括Sam Ruby、Dave Thomas、David Heinemeier Hansson等,他们都是在Ruby社区内享有...

    rails_best_practices:Rails项目的代码度量工具

    rails_best_practices ...默认情况下,rails_best_practices将解析vendor , spec , test和features目录中的代码。 排除目录 要排除目录,只需使用-e或--exclude调用: rails_best_practices -e "db/migrate

    InspiniaAdmin 2.5 Rails_Seed_Project

    在这个Rails_Seed_Project中,开发者可以找到一个典型的Rails应用结构,包括Gemfile、config.ru、database.yml等核心配置文件,以及models、controllers、views和assets等目录,它们分别对应着业务逻辑、数据操作、...

    inspinia admin - v2.5 Rails_Seed_Project

    本文将详细探讨其在Rails框架下的种子项目(Rails_Seed_Project),旨在帮助开发者更好地理解和运用这一强大的工具。 首先,我们来了解一下“Inspinia Admin”。这是一款基于Bootstrap 3构建的响应式后台模板,提供...

    Rails_3_Cheat_Sheets.pdf

    Rails_3_Cheat_Sheets.pdf

    link_to_action:link_to用于特定操作

    LinkToAction 助手集:link_to_new,link_to_index,link_to_show,link_to_edit,link_to_destroy 额外帮手:link_to_back 启用了Twitter Bootstrap的演示应用程序源: 想要与一起使用此宝石吗? 提出。为什么Rails...

    Complex Rails system_Rails_优化_

    在构建复杂的Rails应用时,性能优化是至关重要的。Rails,作为一个强大的Web开发框架,虽然提供了丰富的功能和便利性,但如果不进行适当的优化,可能会导致应用程序响应时间变慢,资源消耗过大,甚至影响用户体验。...

    validates_existence:验证 Rails 模型belongs_to 关联是否存在

    这个插件库添加了 ActiveRecord 模型,一种在保存时检查:belongs_to关联是否实际存在的方法。 这是通过向基本验证模块添加validates_existence_of器来实现的。 它还支持:allow_nil =&gt; true/false 、 :allow_new =&gt; ...

    rails_email_preview, 在 Rails 中,预览和编辑应用程序邮件程序模板.zip

    rails_email_preview, 在 Rails 中,预览和编辑应用程序邮件程序模板 Rails 电子邮件预览 使用这里 Rails 引擎在浏览器中预览电子邮件。 兼容 Rails 4.2 。电子邮件审阅: 所有电子邮件预览的列表: 代表有两个主题...

    inspinia_admin_v2.5_Rails_Full_Version

    该模板包含的文件列表“inspinia_admin_v2.5_Rails_Full_Version”很可能包括以下组成部分: 1. **静态资源**:CSS样式文件、JavaScript脚本和图像资源。这些文件用于构建用户界面,包括响应式布局、图表、表单元素...

    InspiniaAdmin 2.5 Rails_full_version

    InspiniaAdmin 2.5 Rails_full_version

    Rails101_by_rails4.0

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

    rails_admin_acts_as_list:rails_admin插件以对记录进行排序

    在您的config/initializers/rails_admin.rb初始化程序中添加配置: RailsAdmin . config do | config | config . model Post do list do sort_by :position # Add Default sorting sort_reverse false # sort p

Global site tag (gtag.js) - Google Analytics