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

Rails宝典七十七式:禁止JavaScript时的Destroy

    博客分类:
  • Ruby
阅读更多
Rails里一般我们这样Destroy:
<%= link_to "Destroy", project_path(project), :confirm => "Are you sure?", :method => :delete %>

但是当客户端浏览器禁止JavaScript时就呆了,没有confirm,直接给删除了
所以如果我们需要考虑这种情况的话,需要给出“可降级”的方案,例如跳转到另一个页面,页面上提示是删除or取消
最终是这样来用:
<!-- projects/index.rhtml -->
<ul>
<% for project in @projects %>
  <li>
    <%=h project.name %>
    <%= link_to_destroy "Destroy", project_path(project), confirm_destroy_project_path(project) %>
  </li>
<% end %>
</ul>

link_to_destroy是自定义的一个helper,第一个参数为link名,第二个参数为允许JavaScript时的link,第三个参数为禁止JavaScript时的link
# projects_helper.rb
def link_to_destroy(name, url, fallback_url)
  link_to_function name, "confirm_destroy(this, '#{url}')", :href => fallback_url
end

实际上link_to_destroy调用了link_to_function,其所调用的JavaScript方法为confirm_destroy:
/* application.js */
function confirm_destroy(element, action) {
  if (confirm("Are you sure?")) {
    var f = document.createElement('form');
    f.style.display = 'none';
    element.parentNode.appendChild(f);
    f.method = 'POST';
    f.action = action;
    var m = document.createElement('input');
    m.setAttribute('type', 'hidden');
    m.setAttribute('name', '_method');
    m.setAttribute('value', 'delete');
    f.appendChild(m);
    f.submit();
  }
  return false;
}

confirm_destroy方法很眼熟吧?对,就是通常我们写Destroy链接时Rails所生成的JavaScript
这里我们的fallback_url为confirm_destroy_project_path:
# routes.rb
map.resources :projects, :member => { :confirm_destroy => :get }

# projects_controller.rb
def confirm_destroy
  @project = Project.find(params[:id])
end

<!-- projects/confirm_destroy.rhtml -->
<% form_for :project, :url => project_path(@project), :html => { :method => :delete } do |f| %>
  <h2>Are you sure you want to destroy this project?</h2>
  <p>
    <%= submit_tag "Destroy" %>
    or <%= link_to "cancel", projects_path %>
  </p>
<% end %>


很完美的方案!
但是看看这个episode的comment也很搞笑:
引用

HappyCoder   Oct 29, 2007 at 02:23
If a user doesn't have js enabled, then f*ck him.
分享到:
评论
1 楼 xu_ch 2009-06-24  
 

相关推荐

    Rails的精简版本Rails::API.zip

    Rails::API 是 Rails 的精简版本,针对不需要使用完整 Rails 功能的开发者。 Rails::API 移除了 ActionView 和其他一些渲染功能,不关心Web前端的开发者可更容易、快速地开发应用程序,因此运行速度比正常的 Rails ...

    Ruby on Rails:Rails与JavaScript集成.docx

    Ruby on Rails:Rails与JavaScript集成.docx

    Rails上的API:使用Rails构建REST APIAPIs on Rails: Building REST APIs with Rails

    resources :users, only: [:index, :show, :create, :update, :destroy] end ``` 3. **实现控制器**:针对每个路由编写相应的控制器方法,如`index`用于获取所有用户列表、`show`用于显示单个用户的详情等。 4. *...

    Rails中应用Ext.tree:以中国的省市地区三级联动选择为例

    在Ruby on Rails(Rails)框架中,开发人员经常需要实现各种用户交互功能,例如三级联动选择,这在处理如中国省市区这样的地理数据时尤其常见。这篇博客文章“Rails中应用Ext.tree:以中国的省市地区三级联动选择为...

    webpack-rails, 将 web pack与你的Ruby on Rails 应用程序集成.zip

    webpack-rails, 将 web pack与你的Ruby on Rails 应用程序集成 不再维护webpack-rails 不再被维护。 有关详细信息,请参阅 #90. web pack-railsweb pack 为你提供了将 web pack集成到现有的Ruby on Rails 应用程序中...

    [Rails] Crafting Rails Applications (英文版)

    [Pragmatic Bookshelf] Crafting Rails Applications Expert Practices for Everyday Rails Development (E-Book) ☆ 图书概要:☆ Rails 3 is a huge step forward. You can now easily extend the framework, ...

    rails中使用javascript日期控件

    WebCalendar.js是一个轻量级的JavaScript库,用于创建交互式的日期选择器,它可以方便地与Rails框架结合,帮助开发者构建出用户友好的日期输入界面。 首先,我们需要理解Rails与JavaScript的交互方式。在Rails中,...

    Ruby on Rails入门例子

    Ruby on Rails,简称Rails,是一种基于Ruby语言的开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在使Web开发过程更加高效、简洁。本篇将通过一个入门实例,深入探讨Rails的基本概念和核心...

    vite_rails:Rails中的:high_voltage:Vite.js,为您JavaScript体验带来欢乐

    允许您使用为Rails应用程序的前端供电。 是将前端工具像Ruby一样进行编程,纯属喜悦! :smiling_face_with_heart-eyes: 或在运行的检查。 产品特点 :high_voltage: :light_bulb: 即时服务器启动 :high_voltage: ...

    rails-wrapper:用于FusionCharts JavaScript图表库的Ruby On Rails宝石

    Fusioncharts Rails Rails包装器可使用FusionCharts构建图表。 安装(RubyGems) 将此行添加到您的应用程序的Gemfile中: gem 'fusioncharts-rails' 然后执行: $ bundle 或将其自己安装为: $ gem install...

    Rails-API-React-Tutorial:Rail一个Rails 5 API后端React JS前端指南。 了解API设置,序列化程序,响应提取调用和应用设置

    Rails-API-React-Tutorial :laptop: 嘿! 这是一个非常容易遵循的Rails / React API教程,从头到尾全面深入。 本指南向您展示如何通过create-react-app将Ruby on Rails 5 API与React JS一起安装以及如何连接前端和...

    RailsBooster:预配置的 Ruby On Rails 模板以提供即时生产力 :high_voltage:

    :rocket: 轨道助推器 ... rails new blog --skip-javascript --skip-webpacker -d postgresql -m https://raw.githubusercontent.com/bilalbudhani/railsbooster/master/template.rb 执照 RailsBooster 在 MIT

    rails4.0.0

    Rails 4.0.0是Ruby on Rails框架的一个重要版本,它在2013年发布,带来了许多改进和新特性,旨在提升开发效率和应用性能。Ruby on Rails(简称Rails)是一个基于Ruby语言的开源Web应用程序框架,遵循MVC(模型-视图-...

    Rails 101S

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

    Rails3常用命令行命令

    Rails3 是 Ruby on Rails ...熟练掌握这些命令,将极大地提高你的开发效率,使你在构建Ruby on Rails应用时更加得心应手。记住,实践是学习的最佳途径,尝试在实际项目中运用这些命令,你将更加熟悉Rails的工作流程。

    Ruby on Rails入门经典代码

    - Rails Console:交互式的命令行环境,用于调试和测试代码。 - Rails Server:启动本地开发服务器。 7. **Rails最佳实践**: - RESTful设计:遵循HTTP动词(GET, POST, PUT, DELETE)来设计API。 - Convention...

    rails-bootstrap-toggle-buttons:Rails资产管道的非官方引导切换按钮(> 3.1)

    Rails :: Bootstrap :: Toggle :: Buttons 这款宝石旨在提供捆绑在简单宝石中的靴子。 安装 将此行添加到您的应用程序的Gemfile中: gem 'rails-bootstrap-toggle-buttons' 然后执行: $ bundle 或将其自己安装...

    rails_admin_image_manager:RailsAdmin和CKEditor的图像管理器

    $ rails generate rails_admin_image_manager:install 将上传文件路径添加到您的.gitignore文件中 /public/rails_admin_image_manager 运行迁移 $ rails db:migrate SCOPE=rails_admin_image_manager 安装图像管理...

Global site tag (gtag.js) - Google Analytics