2012-06-04 9 views
6

Ich befolge derzeit Michael Hartls Rails Tutorial und habe es bis 7.22 ohne größere Probleme geschafft. Allerdings bin ich durch die Ausgabe von der Test stapfte die sagt:Michael Hartl Rails Tutorial Kapitel 7 Fehler Aktion nicht in UsersController gefunden

Failures: 

    1) UserPages signup with invalid information should not create a user 
    Failure/Error: expect{click_button submit }.not_to change(User, :count) 
    AbstractController::ActionNotFound: 
     The action 'create' could not be found for UsersController 
    # (eval):2:in `click_button' 
    # ./spec/requests/user_pages_spec.rb:29:in `block (5 levels) in <top (required)>' 
    # ./spec/requests/user_pages_spec.rb:29:in `block (4 levels) in <top (required)>' 

    2) UserPages signup with valid information should create a user 
    Failure/Error: expect{click_button submit}.to change(User, :count).by(1) 
    AbstractController::ActionNotFound: 
     The action 'create' could not be found for UsersController 
    # (eval):2:in `click_button' 
    # ./spec/requests/user_pages_spec.rb:42:in `block (5 levels) in <top (required)>' 
    # ./spec/requests/user_pages_spec.rb:42:in `block (4 levels) in <top (required)>' 

Finished in 0.7718 seconds 
6 examples, 2 failures 

ich folgendes auf meine Nutzer-Controller Seite als durch das Tutorial instruiert hinzugefügt haben:

class UsersController < ApplicationController 
    def show 
    @user = User.find(params[:id]) 
    end 

    def new 
    @user = User.new 
    end 

end 

aber es noch doesn‘ Es scheint zu funktionieren. Ich habe versucht, indem ein Verfahren schaffen, aber das wirft nur einen fehlenden Template Fehler zurück ...

Falls es hier ist der Ausgang des Rake-Routen Befehls hilft:

~/dev/rails/sample_app$ rake routes 
    users GET /users(.:format)   users#index 
      POST /users(.:format)   users#create 
new_user GET /users/new(.:format)  users#new 
edit_user GET /users/:id/edit(.:format) users#edit 
    user GET /users/:id(.:format)  users#show 
      PUT /users/:id(.:format)  users#update 
      DELETE /users/:id(.:format)  users#destroy 
    root  /      static_pages#home 
    signup  /signup(.:format)   users#new 
    help  /help(.:format)   static_pages#help 
    about  /about(.:format)   static_pages#about 
    contact  /contact(.:format)  static_pages#contact 

Als Reaktion auf einen Kommentar, Die Tests, die fehlschlagen sind:

describe "signup" do 

     before{ visit signup_path } 
     let(:submit) {"Create my account"} 

     describe "with invalid information" do 
     it "should not create a user" do 
      expect{click_button submit }.not_to change(User, :count) 
     end 
     end 

     describe "with valid information" do 
     before do 
      fill_in "Name", with: "Example User" 
      fill_in "Email", with: "[email protected]" 
      fill_in "Password", with: "foobar" 
      fill_in "Confirmation", with: "foobar" 
     end 

     it "should create a user" do 
      expect{click_button submit}.to change(User, :count).by(1) 
     end 
     end 
    end 

Vielen Dank im Voraus für jede Beratung!

+0

Ich sehe die Benutzer # Route erstellen, also nehme ich an, dass die Erstellungsaktion in Ihrem Controller definiert ist? Post die entsprechenden Tests, möglicherweise Tippfehler irgendwo – TheIrishGuy

+0

@TheIrishGuy die fehlgeschlagenen Tests wurden über danke – TangoKilo

+0

Wenn es eine "fehlende Vorlage" Fehler wirft, dann haben Sie wahrscheinlich keine 'create' Vorlage. –

Antwort

20

Die Tests sollte an diesem Punkt nicht werden vorbei. Folgen Sie dem Tutorial und Sie werden sehen, wie es funktioniert.

+0

Stellen Sie sicher, dass Sie den Test genau wie @mhartl ausführen. AKA: rspec spec/requests/user_pages_spec.rb -e "Anmeldeseite" An dieser Stelle des Tutorials wird erwartet, dass alle Tests mit nur rspec fehlschlagen. – vinnymac

0

config.use_transactional_fixtures = true in Ihrer applications.rb Datei

und stellen Sie sicher, dass Sie haben eine Aktion erstellen in Ihrem Userscontroller

definiert
1

hatte ich das gleiche Problem (beide Anmeldungen-Tests wurden vorbei noch nicht am Ende 7.3.1) und bemerkte später, dass ich den folgenden Fehler gemacht hatte:

Wenn ich die create Methode in der Users hinzugefügt Controller, überschrieb ich versehentlich die new Methode mit der create Methode (ich verwirrte sie). Sie benötigen jedoch beide Methoden. Jetzt funktioniert es.

Ich hoffe, das ist eine Hilfe für jemanden!

0

fügen Sie diese zu Ihrer app/Controller/users_controller.rb:

class UsersController < ApplicationController 
    attr_accessible :tags_attributes 
    # GET /users 
    # GET /users.json 
    def index 
    @users = User.all 

    respond_to do |format| 
     format.html # index.html.erb 
     format.json { render json: @users } 
    end 
    end 

    # GET /users/1 
    # GET /users/1.json 
    def show 
    @user = User.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.json { render json: @user } 
    end 
    end 

    # GET /users/new 
    # GET /users/new.json 
    def new 
    @user = User.new 

    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render json: @user } 
    end 
    end 

    # GET /users/1/edit 
    def edit 
    @user = User.find(params[:id]) 
    end 

    # POST /users 
    # POST /users.json 
    def create 
    @user = User.new(params[:user]) 

    respond_to do |format| 
     if @user.save 

     format.html { redirect_to @user, notice: 'User was successfully created.' } 
     format.json { render json: @user, status: :created, location: @user } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PUT /users/1 
    # PUT /users/1.json 
    def update 
    @user = User.find(params[:id]) 

    respond_to do |format| 
     if @user.update_attributes(params[:user]) 
     format.html { redirect_to @user, notice: 'User was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: "edit" } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /users/1 
    # DELETE /users/1.json 
    def destroy 
    @user = User.find(params[:id]) 
    @user.destroy 

    respond_to do |format| 
     format.html { redirect_to users_url } 
     format.json { head :no_content } 
    end 
    end 
end 
0

Sie benötigen einen create Aktion hinzuzufügen (ich war das gleiche Problem):

class UsersController < ApplicationController 
    def show 
    @user = User.find(params[:id]) 
    end 

    def new 
    @user = User.new 
    end 


    def create 
    @user = User.new(params[:user]) 
    if @user.save 
     flash[:success] = "Welcome to the Sample App!" 
     redirect_to @user 
    else 
     render 'new' 
    end 
    end 
end 
4

ich mit dem rang Das Gleiche für ungefähr eine halbe Stunde, bevor Sie den Fehlercode sehen und direkt hier ankommen. @mhartl ist offensichtlich korrekt und es gibt keinen Tippfehler im Tutorial, es ist nur etwas verwirrend, wenn er sagt, dass die "Tests für die Anmeldeseite" wieder funktionieren sollten. Er erwähnte nichts von Einreichungen von der Anmeldeseite (dies sollten die beiden Tests sein, die an dieser Stelle im Tutorial fehlschlagen).

0

Hatte das gleiche Problem. Fix kommt im Abschnitt "Anmeldefehler", Seite 305 in der zweiten Ausgabe, also mach einfach weiter. Sie vermissen die create-action im Controller. Wie oben erwähnt, ist die Erwähnung der Anmelde-Seitentest-Arbeit verwirrend. Es ist nur die Seite, die funktioniert, nicht das Formular absenden.

Das Buch ist absolut hervorragend, eines der besten Codebücher, die ich gelesen habe, in der Tat die beste.Wie oft mit Beispielcode über viele Seiten oder in diesem Fall das ganze Buch, kann es ein wenig verwirrend werden, vor allem, wenn Sie etwas verpassen. Die Lösung hier wäre, im Buch immer klar zu sagen, was in welchem ​​Stadium funktionieren soll und was nicht und welche Dinge später getan werden, um Dinge zur Arbeit zu bringen. Hartl tut es, aber einige Flecken sind immer noch wahrscheinlich, um Leute zu verwirren. Wiederholungen und Schreibweisen würden nicht schaden.