如何使用.tap方法建立关联记录?

时间:2014-10-03 08:35:20

标签: ruby ruby-on-rails-4

我有一个与用户相关联的omniauth身份验证模型。

aka用户有很多身份验证。

我希望使用tap建立这种身份验证模型的键值对,因为twitter提供了一个秘密密钥,而facebook却没有。

所以,如果我有这个,我想使用.tap方法完成以下条件语句。

class User < ActiveRecord::Base

  def apply_omniauth(omni)
    if omni['credentials']['secret']
      self.authentications.build(:provider     => omni['provider'],
                                 :uid          => omni['uid'],
                                 :token        => omni['credentials']['token'],
                                 :token_secret => omni['credentials']['secret']
    else
      self.authentications.build(:provider     => omni['provider'],
                                 :uid          => omni['uid'],
                                 :token        => omni['credentials']['token']
    end
  end

end

更新

我正在尝试这种方式。这是否与上述相同?

self.authentications.build.tap do |auth|
  auth[:provider]     = omni['provider']               if omni['provider']
  auth[:uid]          = omni['uid']                    if omni['uid']
  auth[:token]        = omni['credentials']['token']   if omni['credentials']['token']
  auth[:token_secret] = omni['credentials']['secret']  if omni['credentials']['secret']
end

1 个答案:

答案 0 :(得分:0)

我认为你可以这么做(self在这里已经过时了):

authentications.build(:provider     => omni['provider'],
                      :uid          => omni['uid'],
                      :token        => omni['credentials']['token'],
                      :token_secret => omni['credentials']['secret'])

如果缺少任何键,则只需指定nil值。除非你有一些用于设置这些属性的自定义逻辑,否则在分配nil或不为新记录分配任何内容之间没有区别。