Comprender la respuesta de Rails 3 con
Utilizando el nuevo ActionControllerrespond_with
método ... ¿cómo determina qué representar cuando la acción (guardar) es exitosa y cuándo no?
Pregunto porque estoy tratando de hacer que pase una especificación generada por el andamio (incluida a continuación), aunque solo sea para poder entenderla. La aplicación funciona bien pero, curiosamente, parece estar renderizando/carriers
(al menos eso es lo que dice la URL del navegador) cuando falla una validación. Sin embargo, la especificación está esperando"new"
(y yo también, para el caso) pero en cambio está recibiendo<"">
. Si cambio la especificación para esperar""
Todavía falla.
Cuando rinde/carriers
esa página muestra los mensajes de error junto a los campos que fallaron la validación como cabría esperar.
¿Alguien familiarizado conrespond_with
¿Ves lo que está pasando aquí?
#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
Especificación que falla:
#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
con este error:
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)>'