Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

rails google認証実装中にエラーが起きてしまいました 初心者のため凡ミスかもしれませんがご教授ください

解決したいこと

google認証中に発生したエラーの解消がしたいです

Ruby on Railsでprogateで作ったサイトを元にTwitterのようなWebアプリをつくっています。
ソーシャルログイン?(google認証)の実装中にエラーが発生しました。
解決方法を教えて下さい。

Rails 7.0.3
ruby 3.1.2
deviseなし

https://qiita.com/take1457a/items/92f4ff602c1522f1cbf8
https://zenn.dev/batacon/articles/e9b4a88ede2889
この記事を参考にgoogle認証を実装を行っています。

発生している問題・エラー

NoMethodError in UsersController#omniauthcreate
undefined method `id' for nil:NilClass

該当するソースコード

users_controller.rb
  def create
    @user = User.new(
      name: params[:name],
      email: params[:email],
      password: params[:password]
    )
    if @user.save
      session[:user_id] = @user.id
      #NoticeMailer.greeting(@user).deliver_now
      flash[:notice] = "ユーザー登録が完了しました"
      redirect_to("/users/#{@user.id}")
    else
      render("users/new")
    end
  end

  def omniauthcreate
    if user = User.find_or_create_from_auth_hash(request.env['omniauth.auth'])
      session[:user_id] = user.id
      session[:user_name] = user.name
      session[:user_email] = user.email
      session[:user_image] = user.image
      redirect_to ("/users/#{@user.id}"), notice: "ログインしました。"←ここの部分がエラーになる原因みたいです
    else
      redirect_to root_path, notice: "失敗しました。"
    end
  end
  
user.rb
  def posts
    return Post.where(user_id: self.id).order(created_at: :desc)
  end

  def self.find_or_create_from_auth_hash(auth_hash)
    provider = auth_hash[:provider]#providerはどのサービスで認証したのかを見分けるもの
    uid = auth_hash[:uid]
    name = auth_hash[:info][:name]
    email = auth_hash[:info][:email]
    image = auth_hash[:info][:image]
 
    #find_or_create_by()は()の中の条件のものが見つければ取得し、なければ新しく作成するというメソッド
    self.find_or_create_by(provider: provider,uid: uid) do |user|
      user.name = name
      user.email = email
      user.image = image
    end
   end

application.html.erb
      <div class="header-icon">
        <% if @current_user %>

          <% if @current_user.avatar? %>
            <%= link_to (image_tag @current_user.avatar_url, class: "icon"), "/users/#{@current_user.id}" %>
          <% else %>      
            <%= link_to (image_tag src="default.jpg", class: "icon"), "/users/#{@current_user.id}" %>
          <% end %> 

    <% end%>
      </div>

      <ul class="header-menus">
        <% if @current_user %>
          <li>
            <%= link_to("企画一覧", "/posts/index") %>
          </li>
          <li>
            <%= link_to("企画提案", "/posts/new") %>
          </li>
          <li>
            <%= link_to("ユーザーリスト", "/users/index") %>
          </li>
          <li>
            <%= link_to("ログアウト", "/logout", {method: "post"}) %>&emsp;&emsp;
          </li>
        <% else %>
          <li>
            <%= link_to("NetaNetaとは", "/about") %>
          </li>
          <li>
            <%= link_to("新規登録", "/signup") %>
          </li>
          <li>
            <%= link_to("ログイン", "/login") %>
          </li>
        <% end %>
      </ul>

最後まで読んでいただきありがとうございます
教えていただけると幸いです
ほかに必要なものがあればすぐに追記します
よろしくお願いします

0 likes

No Answers yet.

Your answer might help someone💌