ruby-on-rails – 了解Rails 3的respond_with

利用ActionController的全新respond_with方法…当action(save)成功并且不成功时,它如何确定要呈现的内容

我问,因为我试图得到一个脚手架生成规格(包括在下面)通过,如果只是这样我可以理解它.该应用程序正常工作,但奇怪的是,当验证失败时,它似乎是渲染/操作符(至少这是浏览器的URL所示).然而,这个规范正在期待着“新”(我也是这样),而是正在接收“&”.如果我更改规格期望“”它仍然失败.

当它呈现/载体时,该页面显示出验证失败的字段旁边的error_messages.

熟悉response_with的任何人都可以看到这里发生了什么?

#carrier.rb
  validates :name,:presence => true 

#carriers_controller.rb
class CarriersController < ApplicationController
  respond_to :html,:json

...

  def new
    respond_with(@carrier = Carrier.new)
  end

  def create
     @carrier = Carrier.new(params[:carrier])
     flash[:success] = 'Carrier was successfully created.' if @carrier.save
     respond_with(@carrier) 
  end

规格是失败的:

#carriers_controller_spec.rb
require 'spec_helper'

describe CarriersController do

  def mock_carrier(stubs={})
    (@mock_carrier ||= mock_model(Carrier).as_null_object).tap do |carrier|
      carrier.stub(stubs) unless stubs.empty?
    end
  end


  describe "POST create" do
    describe "with invalid params" do
      it "re-renders the 'new' template" do
        Carrier.stub(:new) { mock_carrier(:save => false) }
        post :create,:carrier => {}
        response.should render_template("new")
      end
    end
  end
end

有这个错误

1) CarriersController POST create with invalid params re-renders the 'new' template
     Failure/Error: response.should render_template("new")
     expecting <"new"> but rendering with <"">.
     Expected block to return true value.
     # (eval):2:in `assert_block'
     # ./spec/controllers/carriers_controller_spec.rb:81:in `block (4 levels) in <top (required)>'

解决方法

TL:博士

向模拟器添加错误散列:

Carrier.stub(:new) { mock_carrier(:save => false,:errors => { :anything => "any value (even nil)" })}

这将在respond_with中触发所需的行为.

这里发生了什么

在帖子后添加:create

response.code.should == "200"

它预期失败:“200”,得到:“302”.所以它是重定向,而不是渲染新的模板,当它不应该.它在哪里?给我们知道的路径会失败:

response.should redirect_to("/")

现在它失败,预期响应将重定向到< http://test.host/\u0026gt;但是重定向到< http://test.host/carriers/1001\u0026gt; 该规范应该通过渲染新模板来传递,这是在mock上保存的对象返回false之后的正常事件过程.相反,respond_with最终重定向到show_carrier_path.这只是错误的.但为什么? 在源代码挖掘之后,控制器似乎试图渲染“载体/创建”.没有这样的模板,所以出现异常.救援块确定请求是一个POST,并且错误哈希中没有任何内容,控制器重定向认资源,即认载体. 这是令人费解的,因为控制器不应该假设有一个有效的模型实例.毕竟这是一个创造.在这一点上,我只能猜测测试环境是以某种方式进行快捷方式的. 所以解决方法是提供一个假的错误哈希.通常情况下,在保存失败后,哈希会出现某种情况,这样就有道理.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...