Понимание Rails 3 response_with

Используя новый метод ActionController response_with ... как он определяет, что отображать, когда действие (сохранение) выполнено успешно, а когда нет?

Я спрашиваю, потому что я пытаюсь передать спецификацию, сгенерированную скаффолдом (см. Ниже), хотя бы для того, чтобы я мог ее понять. Приложение работает нормально, но, как ни странно, кажется, что оно отображает / carrier (по крайней мере, так написано в URL-адресе браузера), когда проверка не выполняется. Тем не менее, спецификация ожидает «новый» (и я тоже, если на то пошло), но вместо этого получает <""> . Если я изменю спецификацию на ожидание "" , это все равно не удастся.

Когда он отображает / carrier , эта страница показывает error_messages рядом с полями, которые не прошли проверку, как и следовало ожидать.

Может ли кто-нибудь, знакомый с response_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)>'
12
задан Meltemi 15 December 2010 в 03:27
поделиться