使用ActionController的新方法respond_with
...當動作(保存)成功和不成功時,它如何確定呈現內容?Understanding Rails 3's respond_with
我問,因爲我試圖讓腳手架生成規範(包括下面)通過,如果只是爲了我能理解它。該應用程序工作正常,但奇怪的是,當驗證失敗時,它似乎呈現/carriers
(至少這就是瀏覽器的URL所說的內容)。然而,規範期待"new"
(對於這個問題,我也是如此),而是收到<"">
。如果我改變規格以期望""
它仍然失敗。
當它呈現/carriers
時,該頁面顯示驗證失敗的字段旁邊的error_message,正如人們所期望的那樣。
任何人都可以熟悉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])'。 – Ernesto 2012-09-26 19:01:31