Mit ActionControllers neuer Methode respond_with
... wie bestimmt es, was gerendert werden soll, wenn Aktion (Speichern) erfolgreich ist und wenn nicht?Grundlegendes zu Rails 3 response_with
Ich frage, weil ich versuche, eine Scaffold-generierte Spezifikation (unten enthalten) zu erhalten, wenn nur, damit ich es verstehen kann. Die App funktioniert gut, aber seltsamerweise scheint es /carriers
zu rendern (zumindest sagt die URL des Browsers), wenn eine Validierung fehlschlägt. Dennoch erwartet die Spezifikation "new"
(und ich bin es auch) aber stattdessen erhält <"">
. Wenn ich die Spezifikation ändere, um ""
zu erwarten, schlägt sie noch fehl.
Wenn es /carriers
gerendert wird, zeigt diese Seite die error_messages neben den Feldern, die Validierung fehlgeschlagen, wie man erwarten würde.
Kann jemand mit respond_with
vertraut zu sehen, was hier passiert?
#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 das ist versagt:
#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
mit diesem Fehler:
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)>'
Sie rufen "Carrier.new" sowohl in den '# new'- als auch' # create'-Aktionen Ihres Carrier-Controllers auf. Ich denke, es sollte "Carrier.create (params [: carrier])" in der 'def create' Aktionsmethode sein. – Ernesto