2012-06-04 8 views
6

Estoy siguiendo el Tutorial Rails de Michael Hartl en este momento y he logrado 7.22 sin ningún tipo de enganche importante. Sin embargo estoy confundido por la salida de la prueba, que dice:Michael Hartl Rails Tutorial capítulo 7 error Acción no encontrada en UsersController

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 

He añadido lo siguiente a mis usuarios de la página controladores siguiendo las instrucciones del tutorial:

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

    def new 
    @user = User.new 
    end 

end 

pero todavía doesn' parece que funciona He intentado añadir un método de crear, pero que acaba de lanza de nuevo un error de plantilla que falta ...

En caso de que ayuda aquí está la salida del comando rake routes:

~/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 

En respuesta a un comentario, las pruebas que están fallando son:

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 

¡Gracias de antemano por cualquier consejo!

+0

Veo a los usuarios # crear ruta, así que supongo que la acción de crear está definida en su controlador? publique las pruebas apropiadas, podría ser un error ortográfico en alguna parte – TheIrishGuy

+0

@TheIrishGuy las pruebas fallidas se han publicado arriba gracias – TangoKilo

+0

Si arroja un error de "plantilla faltante", entonces probablemente no tenga una plantilla 'create'. –

Respuesta

20

Las pruebas no deben estar pasando en ese momento. Sigue el tutorial y verás cómo funciona.

+0

Asegúrese de ejecutar la prueba exactamente como @mhartl lo tiene. AKA: especificación de rspec/requests/user_pages_spec.rb -e "página de registro" En este punto en el tutorial que ejecuta todas las pruebas utilizando simplemente rspec se espera que falle. – vinnymac

0

config.use_transactional_fixtures = true en su archivo applications.rb

y asegúrese de que haya definido una acción de crear en su UsersController

1

I tenían el mismo problema (ambos Registrar-pruebas todavía no estaban pasando al final de 7.3.1) y más tarde notó que había hecho el siguiente error:

Cuando añadí el método create en el Users controlador, accidentalmente sobrescribí el método new con el método create (los confundí). Sin embargo, necesitas ambos métodos. Ahora funciona.

Espero que esto sea de ayuda para alguien!

0

agregar esto a su aplicación/controlador/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

es necesario agregar una acción create (que estaba teniendo el mismo problema):

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

tuve problemas con el Lo mismo durante aproximadamente media hora antes de leer el código de error y venir directamente aquí. @mhartl es obviamente correcto y no hay ningún error tipográfico en el tutorial, es solo que es un poco confuso cuando dice que las "pruebas para la página de registro" deberían estar funcionando nuevamente. No mencionó nada sobre las presentaciones de la página de registro (que deberían ser las dos pruebas que están fallando en este punto del tutorial).

0

Tenía el mismo problema. La reparación viene en la sección "Error de suscripción", página 305 en la segunda edición, así que simplemente continúa. Te estás perdiendo la acción de crear en el controlador. Como se dijo anteriormente, la mención del trabajo de prueba de la página de registro es confusa. Es solo la página que funciona, no envía el formulario.

El libro es absolutamente excelente, uno de los mejores libros de codificación que he leído, de hecho el mejor.Sin embargo, como suele suceder con el código de muestra que abarca muchas páginas o, en este caso, todo el libro, puede ser un poco confuso, especialmente si se pierde algo. La solución aquí sería indicar siempre claramente en el libro qué se supone que debe funcionar en qué etapa y qué no y qué cosas se van a hacer más tarde para que las cosas funcionen. Hartl sí, pero es probable que algunos puntos confundan a las personas. Repetir y deletrear cosas no haría daño.

Cuestiones relacionadas