1

価値を提供していないFacebookユーザーをどのように処理しますか? koala gem と omniauth を使用しています。

次のエラーが表示されます。

NoMethodError in SessionsController#create
undefined method `[]' for nil:NilClass

app/models/user.rb:14:in `block in from_omniauth'
app/models/user.rb:5:in `tap'
app/models/user.rb:5:in `from_omniauth'
app/controllers/sessions_controller.rb:3:in `create'

そして、アプリが認証しようとしている Facebook ユーザーが、場所、教育履歴など、アプリが必要とするデータ値を持っていないため、このエラーが発生します。

SessionsController で始まる新しいユーザー プロセス:

class SessionsController < ApplicationController
  def create
    user = User.from_omniauth(env['omniauth.auth'])
    session[:user_id] = user.id
    redirect_to root_url, notice: "Signed in!"
  end
end

次に、ユーザーモデルで:

def self.from_omniauth(auth)
where(auth.slice(:provider, :uid)).first_or_initialize.tap do |user|
  user.provider = auth["provider"]
  user.uid = auth["uid"]
  user.name = auth["info"]["name"] unless auth["info"].blank?
  user.first_name = auth["info"]["first_name"] unless auth["info"].blank?
  user.last_name = auth["info"]["last_name"] unless auth["info"].blank?
  user.image = auth["info"]["image"] unless auth["info"].blank?
  user.email = auth["info"]["email"] unless auth["info"].blank?
  user.gender = auth["extra"]["raw_info"]["gender"] if (!auth["extra"].blank? && !auth["extra"]["raw_info"].blank?)
  user.location = auth["extra"]["raw_info"]["location"]["name"] if (!auth["extra"].blank? && !auth["extra"]["raw_info"].blank? && !auth["extra"]["raw_info"]["location"].blank?)          
  user.token = auth["credentials"]["token"] unless auth["credentials"].blank?


    # highschool data
    user.highschool_name = auth["extra"]["raw_info"]["education"][0]["school"]["name"] if (!auth["extra"].blank? && !auth["extra"]["raw_info"]["education"][0]["school"].blank?)
    user.highschool_year = auth["extra"]["raw_info"]["education"][0]["year"]["name"] if (!auth["extra"].blank? && !auth["extra"]["raw_info"]["education"][0]["year"].blank?)
    # graduate school data
    user.graduateschool_name = auth["extra"]["raw_info"]["education"][1]["school"]["name"] if (!auth["extra"].blank? && !auth["extra"]["raw_info"]["education"][1]["school"].blank?)
    user.graduateschool_year = auth["extra"]["raw_info"]["education"][1]["year"]["name"] if (!auth["extra"].blank? && !auth["extra"]["raw_info"]["education"][1]["year"].blank?)

  user.add_friends
  user.save!
      user
 end 
end
end
4

2 に答える 2

1

Object.tryメソッドを使用することもできます。

user.first_name = auth["info"].try(:[], "first_name")

しかし、最善の方法は

unless auth["info"].blank? 
  user.first_name = auth["info"]["first_name"]
  user.last_name = auth["info"]["last_name"]
  user.image = auth["info"]["image"]
  user.email = auth["info"]["email"]
end
于 2012-07-01T19:37:29.830 に答える
0

エラーは 14 行目にあります。たとえば、auth["credentials"]is nilの場合のようなユーザー モデル ファイルでauth["credentials"]["token"]は、同じエラーが発生します。

値を割り当てるときは、チェックを入れてください。user.token = auth["credentials"]["token"] unless auth["credentials"].blank?

アップデート

  user.first_name = auth["info"]["first_name"] unless auth["info"].blank?
  user.last_name = auth["info"]["last_name"] unless auth["info"].blank?
  user.image = auth["info"]["image"] unless auth["info"].blank?
  user.email = auth["info"]["email"] unless auth["info"].blank?
  user.gender = auth["extra"]["raw_info"]["gender"] if (!auth["extra"].blank? && !auth["extra"]["raw_info"].blank?)
  user.location = auth["extra"]["raw_info"]["location"]["name"] if (!auth["extra"].blank? && !auth["extra"]["raw_info"].blank? && !auth["extra"]["raw_info"]["location"].blank?)
  user.token = auth["credentials"]["token"] unless auth["credentials"].blank?
于 2012-07-01T18:01:49.987 に答える