2011-03-04 15 views
10

Sto usando Ruby su Rails 3 e desidero sovrascrivere (possibilmente nel file del modello) il metodo as_json o to_json per fare una richiesta HTTP a respond_to senza includere alcune informazioni.Come sovrascrivere il metodo 'as_json' o 'to_json' al fine di 'respond_to' senza includere le informazioni specificate?

nel mio conto modello ho

def as_json(options = {}) 
    super(
    :except => [ 
     :password 
    ] 
) 
end 

Nel mio controller ho

format.json { 
    render :json => @account, :status => 200 
} 

Quando faccio una richiesta, ad esempio, per /account/1.json ho di nuovo anche la password attributi che , per ragioni di sicurezza, non voglio.

Quindi, come impedire di includere le informazioni specificate?


posso fare questo e funziona

format.json { 
    render :json => @account.to_json(:except => [:password]), :status => 200 
} 

ma ho bisogno di refactoring .

+0

le mie soluzioni seguenti stanno funzionando per me senza refactoring. Non stanno lavorando nel tuo ambiente? – tommasop

risposta

12

Se è solo in un'azione che si può provare:

format.json { render :json => @account, :except => :password } 

se ne avete bisogno per più di un'azione che l'override sarebbe meglio:

# Exclude password info from json output. 
def to_json(options={}) 
    options[:except] ||= :password 
    super 
end 

lo stesso è un bene per as_json

# Exclude password info from json output. 
def as_json(options={}) 
    options[:except] ||= :password 
    super 
end 
+0

Per funzionare, DEVO usare 'render: json => @ account.to_json' invece di 'render: json => @account'. Penso che ci sia un modo per farlo senza includere '.to_json' ... – user502052

+1

in rails 3 se si sovrascrive il metodo as_json nel modello e poi si metta format.json {render: json => @account} nel controller funziona senza chiamare to_json – tommasop

+0

Per me quello non funziona. - Amico ;-) – user502052

0

La soluzione migliore è quella di ignorare as_json metodi nel modello come segue:

def as_json options={} 
    super(
    include: {ADD THE RELATIONS YOU WANT TO INCLUDE}).merge({YOU CAN MERGE EXTRA PARAMETER HERE}) 
end 

Si potrebbe utilizzare solo (il che significa che gli unici parametri che hai elencato saranno di ritorno) o utilizzare tranne (che significa ritornare tutti i parametri eccetto il quelli elencati).

Problemi correlati