Ruby on rails 设计+;Omniauth+;Heroku在#new_with_会话中的未定义方法

Ruby on rails 设计+;Omniauth+;Heroku在#new_with_会话中的未定义方法,ruby-on-rails,ruby,heroku,devise,omniauth,Ruby On Rails,Ruby,Heroku,Devise,Omniauth,社交登录在开发中非常有效,但一旦推到heroku,我就会在new中得到NoMethodError(未定义的方法'each'表示nil:NilClass) 从我的用户模型: def self.new_with_session(params, session) if session["devise.user_attributes"] new(session["devise.user_attributes"], without_protection: true) do |user|

社交登录在开发中非常有效,但一旦推到heroku,我就会在
new
中得到
NoMethodError(未定义的方法'each'表示nil:NilClass)

从我的用户模型:

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

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

解决了!事实上,问题在于gem上的acts_as_taggable_。由于
session[“design.user\u attributes”]
包含了所有
user
属性,当其中一个属性“充当标记”时,就像我的例子中的“技能”或“兴趣”,gems魔术似乎将其转换为多参数或嵌套的paramater属性,然后rails尝试在这些值上循环-在我的例子中是nil。因此,如果存在
“skills”=>nil
,我会得到一个
未定义的方法,用于nil
错误

我还没有深入检查gems的源代码,以确认问题出在哪里,但我相信rails中的错误来自于中的第25行或第27行

简单的解决方案是添加
会话[“design.user_attributes”]。如果{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

你有一些变量,当它不应该是nil时。每个电话在哪里?但很可能您忘记配置生产环境;)