Использование нового метода ActionController respond_with
... как он определяет, что отображать, когда действие (сохранение) выполнено успешно, а когда нет?
Я спрашиваю, потому что я пытаюсь получить спецификацию, сгенерированную скаффолдом (приведенную ниже), чтобы пройти, хотя бы так, чтобы я мог ее понять. Приложение работает нормально, но, как ни странно, оно отображает /carriers
(по крайней мере, так говорит URL-адрес браузера), когда проверка не удалась. Тем не менее, спецификация ожидает "new"
(и я тоже, если на то пошло), но вместо этого получает <"">
. Если я изменю спецификацию, чтобы ожидать ""
, это все равно не удастся.
Когда он отображает /carriers
, эта страница показывает сообщения об ошибках рядом с полями, которые не прошли проверку, как и следовало ожидать.
Кто-нибудь, знакомый с 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.new
как в#new
, так и в#create
действиях вашего контроллера несущей. Я думаю, это должно бытьCarrier.create(params[:carrier])
в методе действияdef create
. - person Ernesto   schedule 26.09.2012