Utilizando el nuevo método respond_with
de ActionController ... ¿cómo determina qué renderizar cuando la acción (guardar) es exitosa y cuando no lo es?Understanding Rails 3's response_with
Lo pido porque estoy tratando de obtener una especificación generada por el andamio (incluida a continuación) para aprobar, solo para poder entenderla. La aplicación funciona bien pero, curiosamente, parece estar representando /carriers
(al menos eso es lo que dice la URL del navegador) cuando falla una validación. Sin embargo, la especificación espera "new"
(y yo también, para el caso), pero en su lugar está recibiendo <"">
. Si cambio la especificación para esperar ""
, aún falla.
Cuando muestra /carriers
esa página muestra los mensajes de error junto a los campos que fallaron la validación como uno esperaría.
¿Alguien que esté familiarizado con respond_with
puede ver lo que sucede 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
Spec que está fallando:
#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)>'
Está invocando 'Carrier.new' en las acciones' # new' y '# create' de su controlador de operador. Supongo que debería ser 'Carrier.create (params [: carrier])' en el método de acción 'def create'. – Ernesto