Передача атрибутов в Mongoid update_attributes () - PullRequest
0 голосов
/ 07 ноября 2011

Я хочу использовать эту функцию из mongoid:

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

Но я хочу передать все атрибуты из другой переменной. Как мне это сделать?

Редактировать: Спасибо всем за ваш ответ. Я новичок в ruby, поэтому сначала я подумал, что просто допустил глупую ошибку. Ошибка была в совершенно другом месте, правильный код, для вашего удовольствия:

  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

Ответы [ 3 ]

6 голосов
/ 07 ноября 2011

Метод update_attributes принимает аргумент Hash, поэтому, если у вас есть Hash, h, только с ключами :first_name и :last_name, тогда:

person.update_attributes(h)

Если у вашего Hash больше ключейтогда вы можете использовать slice, чтобы вывести только те, которые вы хотите:

person.update_attributes(h.slice(:first_name, :last_name))
5 голосов
/ 07 ноября 2011

если вы посмотрите на исходный код Mongoid, вы увидите определение update_attributes в файле .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

Требуется Hash - это означает, что вы можете использовать Hash в качестве передаваемой переменной. например,

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

person.update_attributes( my_attrs )
2 голосов
/ 07 ноября 2011

Что происходит в методе update_attributes и, действительно, на всей платформе Rails переменные помещаются в хеш-код внутри, когда это необходимо.

Таким образом, следующие значения эквивалентны:

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

Где name_hash:

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