gpt4 book ai didi

ruby-on-rails - 了解 Rails 3 的 response_with

转载 作者:行者123 更新时间:2023-12-04 00:32:57 25 4
gpt4 key购买 nike

使用 ActionController 的新 respond_with方法......它如何确定当 Action (保存)成功时呈现什么,当它不成功时?

我问是因为我试图让一个脚手架生成的规范(包括在下面)通过,如果只是为了我能理解它。该应用程序运行良好,但奇怪的是,它似乎正在渲染 /carriers (至少浏览器的 URL 是这样说的)验证失败时。然而,规范期待 "new" (就此而言,我也是)但收到的是 <""> .如果我将规范更改为期望 ""它仍然失败。

当它呈现 /carriers该页面在验证失败的字段旁边显示了 error_messages,正如人们所期望的那样。

有谁熟悉respond_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)>'

最佳答案

电话:博士

向模拟添加错误哈希:

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

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

这是怎么回事

post :create 之后添加这个
response.code.should == "200"

它失败了 expected: "200", got: "302" .因此,它正在重定向而不是在不应该呈现新模板时呈现。它要去哪里?给它一条我们知道会失败的路径:
response.should redirect_to("/")

现在它失败了 Expected response to be a redirect to <http://test.host/> but was a redirect to <http://test.host/carriers/1001>
该规范应该通过渲染 new 来传递。模板,这是 save之后的正常事件过程在模拟 Carrier 对象上返回 false。而是 respond_with最终重定向到 show_carrier_path .这是完全错误的。但为什么?

在对源代码进行一些挖掘之后,似乎 Controller 试图渲染“carriers/create”。没有这样的模板,因此引发了异常。救援块确定请求是 POST 并且错误哈希中没有任何内容, Controller 重定向到默认资源,即模拟 Carrier .

这令人费解,因为 Controller 不应假设存在有效的模型实例。这是一个 create毕竟。在这一点上我只能猜测测试环境在某种程度上走捷径。

所以解决方法是提供一个假的错误哈希。通常在 save 之后的哈希中会有一些东西失败,所以有点道理。

关于ruby-on-rails - 了解 Rails 3 的 response_with,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4446378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com