2012-06-20 10 views
7

Updating, showing, and deleting users, exercisesdi Hartl Rails Tutorial Capitolo 9 Esercizio 6

C'è un modo per creare un test Rspec per le azioni dell'utente del controller, come "creare" e "di nuovo?"

Non sono abbastanza chiaro sulla differenza tra le due azioni "create" e "new" stesse; qualcuno potrebbe essere così gentile da elaborare?

Dopo aver creato il test, come avrei dovuto implementare il redirect_to root_path? Penso che dovrei includere le azioni "new" e "create" nella sezione signed_in before_filter, ma questo non reindirizza automaticamente alla root.

Ho cercato di ottenere i test di passare modificando il file users_controller.rb come segue:

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

risposta

1
  1. Sì; e questo è parzialmente iniziato intorno a 7.16 e altrove.
  2. Uno effettivamente crea un utente (create). Uno è per la pagina per creazione di un nuovo utente (new).
  3. Non sono sicuro di aver capito la domanda.
+0

Si prega di consultare il mio sopra modifica; si spera che fornirà una certa chiarezza. Apprezzo molto il vostro aiuto. Non ho potuto commentare qui prima per qualche motivo ... – railser

+0

@ user1469059 Ancora non sono sicuro di aver capito. –

+0

Dovresti modificare users_controller.rb come mostrato sopra reindirizzare gli utenti che hanno eseguito l'accesso al percorso root, ma funzionano correttamente altrimenti? – railser

10

ho fatto una prima del filtro per questo, sembra funzionare bene, per il test mi ha fatto questo:

su authentication_pages_spec.rb

describe "signin" do 
    describe "authorization" do 
    describe "for signed in users" do 
     let(:user) { FactoryGirl.create(:user) } 
     let(:new_user) { FactoryGirl.attributes_for(:user) } 
     before { sign_in user } 

     describe "using a 'new' action" do 
     before { get new_user_path } 
     specify { response.should redirect_to(root_path) } 
     end 

     describe "using a 'create' action" do 
     before { post users_path new_user } 
     specify { response.should redirect_to(root_path) } 
     end   
    end 
    end 
end 

Come @WillJones dice, alcune persone potrebbero deve aggiungere no_capybara: true alla prima del blocco

e sul mio regolatore utenti:

before_filter :signed_in_user_filter, only: [:new, :create] 

def signed_in_user_filter 
    redirect_to root_path, notice: "Already logged in" if signed_in? 
end 

per la differenza tra i nuovi e creare azioni, ha a che fare con lo stile architettonico REST, ma in fondo, new è un'azione dal regolatore utenti che risponde a una richiesta GET ed è quello che è responsabile della restituzione del visualizza risponde (in questo caso, un nuovo modulo utente). create d'altra parte, è un'azione che risponde a una richiesta POST, non esegue il rendering di nulla (può rispondere con javascript, ma è un argomento avanzato) ed è quella responsabile della creazione di nuovi utenti, come il nome dell'azione implica .

+0

Questo mi ha aiutato un sacco, grazie! – wikichen

+3

Per far funzionare il mio dovevo passare 'before {sign_in user, no_capybara: true}' e passare 'users_path (user)'. Solo per le informazioni degli altri! – WillJones

+0

@WillJones: Grazie. L'ho fissato per 45 minuti e il tuo suggerimento su no_capybara: true mi ha salvato. –

0

Ho fatto un filtro precedente anche per quello, ma il mio filtro è diverso e non capisco perché funzioni.

mio controllore utenti è seguenti voci

class UsersController < ApplicationController 
. 
. 
    before_filter :logged_in_user, only: [:new, :create] 
. 
. 
def logged_in_user 
     redirect_to(root_path) if !current_user?(@user) 
    end 

funziona bene come in s' rkrdo esempio e prove corrispondenti passano. Ma vuol dire che current_user non è la stessa cosa di un utente quando l'utente è registrato e viceversa? A mio parere dovrebbero essere uguali nel primo caso e non dovrebbero in secondo luogo.

Problemi correlati