【发布时间】:2010-12-15 03:15:58
【问题描述】:
利用 ActionController 的新 respond_with 方法...它如何确定当操作(保存)成功时渲染什么,什么时候不成功?
我之所以这么问,是因为我试图让一个脚手架生成的规范(包括在下面)通过,只要我能理解它。该应用程序运行良好,但奇怪的是,当验证失败时,它似乎正在呈现/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)>'
【问题讨论】:
-
您在运营商控制器的
#new和#create操作中都调用了Carrier.new。我猜应该是def create动作方法中的Carrier.create(params[:carrier])。
标签: ruby-on-rails rspec respond-with