2009-02-24 16 views
55

So che questa potrebbe essere una domanda stupida, ma non so come creare un metodo ruby ​​che accetta un hash di parametri. Voglio dire, in Rails mi piacerebbe utilizzare un metodo come questo:Creare un metodo ruby ​​che accetta un hash dei parametri

login_success :msg => "Success!", :gotourl => user_url 

Qual è il prototipo di un metodo che accetta questo tipo di parametri? Come li leggo?

risposta

59

Se si passano i parametri a una funzione Ruby nella sintassi dell'hash, Ruby assumerà che è il proprio obiettivo. Così:

def login_success(hsh = {}) 
    puts hsh[:msg] 
end 
+0

Non posso usare qualcosa come login_success (* params)? – collimarco

+5

a * (ovvero operatore splat) significa che il metodo accetta qualsiasi numero di argomenti e li inserisce in un array chiamato params. Decidere se usarlo o meno dipende da cosa stai cercando. Nell'esempio che hai fornito, un hash ha senso. – Allyn

+6

Questo dice che ci si aspetta un numero qualsiasi di argomenti. Mi piace 'pippo (1,: b, '3')'. Inoltre, non hai bisogno della parte "= {}" di quello. questo funzionerà bene: def login_success (hash). Il codice precedente imposta semplicemente il valore predefinito come hash vuoto. –

30

Una cosa fondamentale da ricordare è che si può fare solo la sintassi dove si lascia fuori i caratteri hash {}, se il parametro hash è l'ultimo parametro di una funzione. Quindi puoi fare quello che ha fatto Allyn e questo funzionerà. Anche

def login_success(name, hsh) 
    puts "User #{name} logged in with #{hsh[:some_hash_key]}" 
end 

E così si può chiamare con

login_success "username", :time => Time.now, :some_hash_key => "some text" 

Ma se l'hash non è l'ultimo parametro è necessario circondare gli elementi di hash con {}.

5

Utilizzare un solo argomento. Ruby trasformare i valori denominati in un hash:

def login_success arg 
# Your code here 
end 

login_success :msg => 'Success!', :gotourl => user_url 
# => login_success({:msg => 'Success!', :gotourl => user_url}) 

Se davvero si vuole essere sicuri di ottenere un hash, al posto del duck typing predefinita rubino, allora si avrebbe bisogno di controllare per questo. Qualcosa di simile, per esempio:

def login_success arg 
    raise Exception.new('Argument not a Hash...') unless arg.is_a? Hash 
    # Your code here 
end 
5

Con l'avvento di argomenti chiave nel Ruby 2.0 ora è possibile farlo

def login_success(msg:"Default", gotourl:"http://example.com") 
    puts msg 
    redirect_to gotourl 
end 

In Ruby 2.1 è possibile lasciare i valori di default,

def login_success(msg:, gotourl:) 
    puts msg 
    redirect_to gotourl 
end 

Quando chiamato, lasciando fuori un parametro che non ha un valore predefinito aumenterà un ArgumentError

+2

Si potrebbe anche voler dire che è possibile tralasciare i valori predefiniti in Ruby 2.1 per rendere i parametri richiesti, ad es. 'def login_success (msg :, gotourl:)' genererà un errore se si tenta di chiamare 'login_success' senza specificare i parametri' msg' e 'gotourl'. – Ajedi32

Problemi correlati