[AWDwR4]13章 Playtime1 的实现

13.PlayTime 1:
  向orders表加入ship_date字段,当OrdersController更新这个值后发送一个emial通知。这个官方网站上没有提供参考的答案,论坛里有简单版本我自己实现了一个稍微复杂一点的。
   我的思路是在每个order的show模板中加入一个按钮 Ship it now,每个order只有一次ship的机会,这样就避免了重复ship。
   step1:
   先在 orders_controller 中手动加入ship这个action:

# PUT /orders/1
  # PUT /orders/1.json
  def ship
    @order = Order.find(params[:id])

    respond_to do |format|
      if @order.ship_date.nil? && @order.update_attributes(:ship_date=>Time.now)
        Notifier.order_shipped(@order).deliver

        format.html { redirect_to @order, notice: ‘Order was successfully shiped.‘ }
        format.json { head :no_content }
      else
        format.html { redirect_to order_url(@order), notice: ‘Order already shiped.‘}
        format.json { render json: @order.errors, status: :unprocessable_entity }
      end
    end
  end

  使用了PUT方法,因为之前看过酷壳上的一篇文章讲到,PUT方法具有幂等性,所以对同一个order进行多次ship操作和一次ship操作的副作用是相同的。
  step2    因为ship这个action是手动添加进去的,所以需要手动添加路由,让Rails路由能够识别URL并将请求分发到order控制器的ship中,可参照成员(Member)路由
     修改 config/routes.rb,加入:

    resources :orders do
        put :ship, :on => :member
    end

  step3 在app/views/orders/show.html.erb模板中添加ship按钮

<% if @order.ship_date.nil? %>
    <%= button_to ‘Ship it now!‘, ship_order_path(@order), :method => :put %>
<% end%>

  其中使用了 ship_order_path这个helper,我是仿照 <%= link_to ‘Edit‘, edit_order_path(@order) %> 这个来写的,当时没有添加路由,所以报错,找不到这个函数。后来看了rails路由后,才明白 "建立一个 Resourceful 的路由的同时也会为你的应用自动添加一系列的 Helper 方法"这句话的意思。

时间: 2024-08-05 04:34:23

[AWDwR4]13章 Playtime1 的实现的相关文章

JavaScript权威指南第13章 web浏览器中的javascript

13.1 客户端javascript window对象是所有的客户端javascript特性和api的主要接入点.表示浏览器的一个窗口,可以通过window对象来引用它. window 的方法 alert() prompt() confirm() 13.2 在html里嵌入javascript 4种方法: 内联:放置在<script></script>标签之中 外部引入:<script src="   "></script> html程序

《深入Java虚拟机学习笔记》- 第13章 逻辑运算

<深入Java虚拟机学习笔记>- 第13章 浮点运算 <深入Java虚拟机学习笔记>- 第13章 逻辑运算,布布扣,bubuko.com

阅读《实例化需求》1-3章有感

今天我阅读了<实例化需求>的1-3章. 第一章主要是讲实例化需求的好处.实例化需求说明是一组过程模式,他帮助团队构建正确的产品. 使用实例化需求说明,团队编写的文档恰到好处,在短迭代或基于流的开发中可以有效地协助变更. <实例化需求>这本书不是以理论的方式来构建一个案例来阐述实例化需求说明的好处,而是来自 于那些来自于那些大大受益于实例化需求说明的团队. 实例化需求可以更有效地实施变更,主要是通过活文档.活文档是系统功能的一个信息源,与程序 代码一样可靠,但更容易使用和理解.他帮助

js高程笔记13章

第13章 事件 1.事件流:描述从页面中接收事件的顺序. 三个阶段:捕获,处于目标,冒泡. 2.事件处理程序:局部变量event表示事件对象,this值为事件目标元素. (1)HTML事件处理程序:可以访问特性.弊端:可能调用事件处理程序时,函数还未定义.同时代码紧密耦合,修改不便. (2)DOM0级事件处理程序:this引用当前元素.弊端:一个元素只能添加一个事件处理程序. (3)DOM2级事件处理程序:addEventListener()和removeEventListener().无法移除

第 13 章 装饰模式【Decorator Pattern】

以下内容出自:<<24种设计模式介绍与6大设计原则>> Ladies and gentlemen,May I get your attention,Please?,Now I’m going to talk about decoratorpattern.装饰模式在中国使用的那实在是多,中国的文化是中庸文化,说话或做事情都不能太直接,需要有技巧的,比如说话吧,你要批评一个人,你不能一上来就说你这个做的不对,那个做的不对,你要先肯定他的成绩,表扬一下优点,然后再指出瑕疵,指出错误的地方

《白帽子讲WEB安全》学习笔记之第13章 应用层拒绝服务攻击

第13章 应用层拒绝服务攻击 13.1 ddos简介 DDoS攻击通过大量合法的请求占用大量网络资源,以达到瘫痪网络的目的.这种攻击方式可分为以下几种: q  通过使网络过载来干扰甚至阻断正常的网络通讯: q  通过向服务器提交大量请求,使服务器超负荷: q  阻断某一用户访问服务器: q  阻断某服务与特定系统或个人的通讯. IP Spoofing IP欺骗攻击是一种黑客通过向服务端发送虚假的包以欺骗服务器的做法.具体说,就是将包中的源IP地址设置为不存在或不合法的值.服务器一旦接受到该包便会

第13章 线程

第13章 线程线程具有提高执行速度的特点. 本章重点:----------------------------------线程的基本概念创建并使用线程线程的让步.同步等操作 进程就是一个执行中的程序,每一个进程都有其独立的内存空间和系统资源.进程就是一个运行的程序,Windows操作系统是支持多进程的操作系统,即同一时间可以执行多个程序,每个程序是在自己独立的内存空间内,使用自己被分配到的系统资源.线程是CPU调度和分派的基本单位,一个进程可以由多个线程组成,而这多个线程共享同一个存储空间,这使

【Android】13.0 第13章 创建和访问SQLite数据库&mdash;本章示例主界面

分类:C#.Android.VS2015: 创建日期:2016-02-26 一.简介 Android 内置了三种数据存取方式:SQLite数据库.文件.SharedPreferences. 这一章我们主要学习如何使用SQLite数据库存取数据. 1.SQLite是个什么档次的数据库 SQLite是一种免费的.开源的数据库,由于它独特的设计(把各种数据类型都转换为它自己内部处理的5种类型)导致其占用内存极少,因此很多项目都喜欢使用它. Android集成了SQLite并内置了专门对SQLite操作

C++ primer plus读书笔记——第13章 类继承

第13章 类继承 1. 如果购买厂商的C库,除非厂商提供库函数的源代码,否则您将无法根据自己的需求,对函数进行扩展或修改.但如果是类库,只要其提供了类方法的头文件和编译后的代码,仍可以使用库中的类派生出新的类.而且可以在不公开实现的情况下将自己的类分发给其他人,同时允许他们在类中添加新特性. 2. 派生类构造函数首先创建基类对象,如果不调用基类构造函数,程序将使用默认的基类构造函数. 3. 创建派生类对象时,程序首先调用基类构造函数,然后再调用派生类构造函数.派生类对象过期时,程序将首先调用派生