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"}) %>  
</li>
<% else %>
<li>
<%= link_to("NetaNetaとは", "/about") %>
</li>
<li>
<%= link_to("新規登録", "/signup") %>
</li>
<li>
<%= link_to("ログイン", "/login") %>
</li>
<% end %>
</ul>
最後まで読んでいただきありがとうございます
教えていただけると幸いです
ほかに必要なものがあればすぐに追記します
よろしくお願いします
0 likes