0

社交登录在开发中运行良好,但一旦推送到 heroku,我就会NoMethodError (undefined method `each' for nil:NilClass)进入new.

从我的用户模型:

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

我在调试中遇到了障碍。有什么想法吗?调试思路?类似的经历?

4

1 回答 1

0

解决了!问题实际上出在acts_as_taggable_on gem 上。由于session["devise.user_attributes"]包含了所有User属性,当它到达其中一个“acts_as_taggable”时,比如在我的情况下是“技能”或“兴趣”,宝石魔法似乎将其变成了多参数或嵌套参数属性,然后 rails 尝试循环值 - 在我的情况下是 nil 。所以,如果"skills"=>nil存在,我会得到一个undefined method each for nil错误。

我还没有深入检查 gems 的源代码来确认问题出在哪里,但我相信 rails 中的错误来自https://github.com/rails/rails/blob中的第 25 或 27 行/master/activerecord/lib/active_record/attribute_assignment.rb

简单的解决方案是添加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
于 2013-01-16T17:46:42.617 回答