2011-11-07 5 views
0

Je veux utiliser cette fonction de MongoId:Passing attribue à MongoId update_attributes()

person.update_attributes(first_name: "Jean", last_name: "Zorg") 

Mais je veux passer dans tous les attributs d'une autre variable. Comment je fais ça?

Editer: Merci à tous pour votre réponse. Je suis nouveau à ruby ​​donc au début je pensais que je viens de faire une erreur stupide avec ça. Le bogue a été dans un endroit complètement différent, le bon code, pour votre plaisir:

def twitter 
    # Scenarios: 
    # 1. Player is already signed in with his fb account: 
    # we link the accounts and update the information. 
    # 2. Player is new: we create the account. 
    # 3. Player is old: we update the player's information. 
    # login with a safe write. 
    puts "twitter" 
    twitter_details = { 
     twitter_name: env["omniauth.auth"]['user_info']['name'], 
     twitter_nick: env["omniauth.auth"]['user_info']['nickname'], 
     twitter_uid: env["omniauth.auth"]['uid'] 
    } 
    if player_signed_in? 
     @player = Player.find(current_player['_id']) 
    else 
     @player = Player.first(conditions: {twitter_uid: env['omniauth.auth']['uid']}) 
    end 

    if @player.nil? 
     @player = Player.create!(twitter_details) 
    else 
     @player.update_attributes(twitter_details) 
    end 

    flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Twitter" 
    sign_in_and_redirect @player, :event => :authentication 
    end 
+0

Vous avez les noms et prénoms dans un Hash? –

+0

Oui (je les ai dans un hachage) – CamelCamelCamel

+1

Ne comprenant pas cela non plus. Si vous avez un hash défini dans une variable, vous pouvez juste passer ce hash dans la fonction ... – WattsInABox

Répondre

5

si vous regardez le code source de MongoId, vous verrez la définition de update_attributes dans le fichier .rvm/gems/ruby-1.9.2-p0/gems/mongoid-2.3.1/lib/mongoid/persistence.rb

# Update the document attributes in the datbase.                           
#                                       
# @example Update the document's attributes                            
# document.update_attributes(:title => "Sir")                           
#                                       
# @param [ Hash ] attributes The attributes to update.                         
#                                       
# @return [ true, false ] True if validation passed, false if not.                      
def update_attributes(attributes = {}) 
    write_attributes(attributes); save 
end 

Il prend un Hash - cela signifie que vous pouvez utiliser un Hash comme la variable qui est passée. eg

my_attrs = {first_name: "Jean", last_name: "Zorg"} 

person.update_attributes(my_attrs) 
6

La méthode update_attributes prend un argument Hash donc si vous avez une table de hachage, h, avec seulement :first_name et :last_name clés alors:

person.update_attributes(h) 

Si votre Hash a plus de touches, vous pouvez utiliser slice à tirez seulement ceux que vous voulez:

person.update_attributes(h.slice(:first_name, :last_name)) 
2

Que se passe-t-il dans la méthode update_attributes et, ind eed, à travers la plate-forme Rails, les variables sont placées dans un hachage interne, si nécessaire.

donc les suivantes sont équivalentes:

person.update_attributes(first_name: "Jean", last_name: "Zorg") 
person.update_attributes({first_name: "Jean", last_name: "Zorg"}) 
person.update_attributes(name_hash) 

Où name_hash est:

name_hash = {first_name: "Jean", last_name: "Zorg"}