2013-01-15 105 views
0

社交登录正在开发中,但一旦推到heroku,我得到NoMethodError (undefined method `each' for nil:NilClass)newDevise + Omniauth + Heroku在#new_with_session中的undefined方法

从我的用户模型:

def self.new_with_session(params, session) 
    if session["devise.user_attributes"] 
    new(session["devise.user_attributes"], without_protection: true) do |user| 
     user.attributes = params 
     user.valid? 
    end 
    else 
    super 
    end 
end 

我已经达到了我的调试路障。有什么想法吗?调试想法?类似的体验?

+0

你有一些变量为零,当它不应该。每次通话在哪里?但很可能你忘了配置你的生产环境;) –

回答

0

解决!问题实际上是与acts_as_taggable_on宝石。由于session["devise.user_attributes"]包含了所有User属性,当它到达其中一个“acts_as_taggable”,就像在我的情况下为“技能”或“兴趣”时,它看起来像宝石魔术一样变成多参数或嵌套参数属性,然后轨试图循环的值 - 这是我的情况。所以,如果"skills"=>nil存在,我得到一个undefined method each for nil错误。

我还没有检查出太多深度的宝石来源,但尚未确认问题出在哪里,但我相信轨道中的错误来自https://github.com/rails/rails/blob/master/activerecord/lib/active_record/attribute_assignment.rb中的25行或27行。

简单的解决方案是将session["devise.user_attributes"].delete_if { |k,v| v.blank? }添加到我的new_with_session方法。

def self.new_with_session(params, session) 
    if session["devise.user_attributes"] 
    session = session["devise.user_attributes"].delete_if { |k,v| v.blank? } 
    new(session, without_protection: true) do |user| 
     user.attributes = params 
     user.valid? 
    end 
    else 
    super 
    end 
end 
相关问题