質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Q&A

解決済

1回答

1029閲覧

Railsでログイン時にエラーが出るようになった

punchan36

総合スコア105

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

0グッド

1クリップ

投稿2020/01/22 03:43

前提・実現したいこと

Railsでログイン時にエラーが出るようになりました(サインイン時も同様です)。

ログイン機能は下記のコードで過去に実装が終わっており、最近はRuby Deviseを使いフォロー機能を実装しておりました(最近ログイン機能は特にいじっておりません)。

しかしフォロー機能実装時にフォローボタンが表示されない問題が起こり、その原因がどうやらログイン機能にある事が分かった為にログアウト・ログインをし直すと、以前は出来ていたログインでエラーが発生しました。
参考質問:【Rails】フォロー機能実装時にフォローボタンが表示されない

久々にログアウト・ログインをし直して気付いた為、いつから(何が原因で)この不具合が裏で出ていたのかが分かりません。どなたかお知恵を拝借出来ましたら幸いです。

発生している問題・エラーメッセージ

ArgumentError in UsersController#login wrong number of arguments (given 0, expected 1) def login @user = User.find_by(email: params[:email]) **if @user && @user.authenticate(params[:password])** session[:user_id] = @user.id flash[:notice] = "ログインしました" redirect_to("/posts/index")

該当のソースコード(users_controller.rb)

Ruby

1class UsersController < ApplicationController 2 before_action :authenticate_user, {only: [:index, :show, :edit, :update]} 3 before_action :forbid_login_user, {only: [:new, :create, :login_form, :login]} 4 before_action :ensure_correct_user, {only: [:edit, :update]} 5 6 def index 7 @users = User.all 8 end 9 10 def show 11 @user = User.find_by(id: params[:id]) 12 end 13 14 def new 15 @user = User.new 16 end 17 18 def create 19 @user = User.new( 20 name: params[:name], 21 email: params[:email], 22 image_name: "default_user.jpg", 23 password: params[:password] 24 ) 25 if @user.save 26 session[:user_id] = @user.id 27 flash[:notice] = "ユーザー登録が完了しました" 28 redirect_to("/users/#{@user.id}") 29 else 30 render("users/new") 31 end 32 end 33 34 def edit 35 @user = User.find_by(id: params[:id]) 36 end 37 38 def update 39 @user = User.find_by(id: params[:id]) 40 @user.name = params[:name] 41 @user.email = params[:email] 42 if params[:image] 43 @user.image_name = "#{@user.id}.jpg" 44 image = params[:image] 45 File.binwrite("public/user_images/#{@user.image_name}", image.read) 46 end 47 if @user.save 48 flash[:notice] = "ユーザー情報を編集しました" 49 redirect_to("/users/#{@user.id}") 50 else 51 render("users/edit") 52 end 53 end 54 55 def login_form 56 end 57 58 def login 59 @user = User.find_by(email: params[:email]) 60 if @user && @user.authenticate(params[:password]) 61 session[:user_id] = @user.id 62 flash[:notice] = "ログインしました" 63 redirect_to("/posts/index") 64 else 65 @error_message = "メールアドレスまたはパスワードが間違っています" 66 @email = params[:email] 67 @password = params[:password] 68 render("users/login_form") 69 end 70 end 71 72 def logout 73 session[:user_id] = nil 74 flash[:notice] = "ログアウトしました" 75 redirect_to("/login") 76 end 77 78 def likes 79 @user = User.find_by(id: params[:id]) 80 @likes = Like.where(user_id: @user.id) 81 end 82 83 def ensure_correct_user 84 if @current_user.id != params[:id].to_i 85 flash[:notice] = "権限がありません" 86 redirect_to("/posts/index") 87 end 88 end 89 90 def top 91 @user = User.find_by(id: params[:id]) 92 @likes = Like.where(user_id: @current_user.id) 93 end 94 95 def following 96 @title = "フォロー" 97 @user = User.find(params[:id]) 98 @users = @user.followings 99 render 'show_follow' 100 end 101 102 def followers 103 @title = "フォロワー" 104 @user = User.find(params[:id]) 105 @users = @user.followers 106 render 'show_follow' 107 end 108 109end

該当のソースコード(login_form.html.erb)

Ruby

1<div class="main users-new"> 2 <div class="container"> 3 <div class="form-heading">ログイン</div> 4 <div class="form users-form"> 5 <div class="form-body"> 6 <% if @error_message %> 7 <div class="form-error"> 8 <%= @error_message %> 9 </div> 10 <% end %> 11 <%= form_tag("/login") do %> 12 <p>メールアドレス</p> 13 <input name="email" value="<%= @email %>"> 14 <p>パスワード</p> 15 <input type="password" name="password" value="<%= @password %>"> 16 <input type="submit" value="ログイン"> 17 <% end %> 18 </div> 19 </div> 20 </div> 21</div>

該当のソースコード(routes.rb)

Ruby

1Rails.application.routes.draw do 2 devise_for :users 3 post "likes/:post_id/create" => "likes#create" 4 post "likes/:post_id/destroy" => "likes#destroy" 5 6 get "login" => "users#login_form" 7 post "login" => "users#login" 8 post "logout" => "users#logout" 9 10 post "users/:id/update" => "users#update" 11 get "users/:id/edit" => "users#edit" 12 post "users/create" => "users#create" 13 get "signup" => "users#new" 14 get 'users/index' => 'users#index' 15 get "users/:id" => "users#show" 16 get "users/:id/likes" => "users#likes" 17 get "/" => "users#top" 18 19 get 'posts/index'=> 'posts#index' 20 get "posts/new" => "posts#new" 21 get "posts/:id" => "posts#show" 22 post "posts/create" => "posts#create" 23 get "posts/:id/edit" => "posts#edit" 24 post "posts/:id/update" => "posts#update" 25 post "posts/:id/destroy" => "posts#destroy" 26 get "posts/search" => "posts#search" 27 28 get 'about/about' 29 get 'home/top' => 'home#top' 30 get 'top' => 'home#top' 31 get 'about' => 'about#about' 32 33 resources :users do 34 member do 35 get :following, :followers, :users_tweets 36 end 37 end 38 resources :relationships, only: [:create, :destroy] 39 40 # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 41end

補足情報(FW/ツールのバージョンなど)

ruby 2.6.4p104
RubyGems 3.0.3
Rails 5.2.3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

wrong number of arguments (given 0, expected 1)

「引数が1つ必要だが、引数が何もない」というエラーが出ています。

loginアクションを実行したときに、下記に何の値が入っているか確認してみると、先に進めるのではないかと思います。

  • @users(User.find_byで取得した結果がちゃんと入っているか?)
  • params(フォームから送った値がちゃんと入っているか?)

↑の確認方法ですが、「Rails デバッグ」等で検索すると色々出てきます(自分はpry-railsというGemをよく使っています)。

投稿2020/01/22 08:34

kyoruni

総合スコア93

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

punchan36

2020/01/22 11:09

ご回答有難うございます!pryすら存じていなかったので、勉強して少し希望が持てました。 受け取りたい情報は@user.name, @user.email, @user.passwordの3つですが、@user.passwordのみNilが返ってきました。他はきちんと受け取れていたようです。 paramsも見ましたが、そちらではpasswordは受け取れており、最後に「permitted: false」とありました…。 色々と調べていきますが、もし原因かと思われる点などありましたらご助言頂けると有難いです。
kyoruni

2020/01/22 15:52 編集

permitted: false が出てきたら、まず最初にストロングパラメータ関連かな?ととりあえず疑っています ストロングパラメータ:許可していない値は受け取らない仕組み = フォームから受け取りたい値を受け取る許可がされていない? ↓こんな雰囲気の記述です params.require(:hoge).permit(:fuga, :piyo) params.permit(:hoge, :fuga) ↓このような感じで使います( form_tag 使ったことがないため不安なので、ストロングパラメータの使い方を検索してみてください) ( すみません…!) - - - - - - - - - -  if @user && @user.authenticate(password_params)   処理  end end private def password_params  params.permit(:password) end - - - - - - - - - -
punchan36

2020/01/23 10:42

丁寧に教えて下さり有難うございます! ストロングパラメータについて今日勉強し試してみましたが、"undefined local variable or method "password_params"と言うエラーが出てきて先へ進めません…。 何度も申し訳ないのですが、だいぶ行き詰っておりますのでご助言頂けると本当に有難いです。 該当のroute、controller、viewをいじっていないのに、他の作業をしている間にパスワードだけ受け取りが出来なくなる…なんて事あるのでしょうか。。
kyoruni

2020/01/23 14:29

貼っていただいているコードをそのまま試してみましたが、同じエラーが出ました。ストロングパラメータ関係なかったです、申し訳ありません… 個人的には「ログイン機能を先に作って、最近はdevise周りを触っていた」という部分が気になりました。ユーザー周りを作って、後からdeviseを導入したという感じでしょうか…?(違ったら無視してください) Railsの赤いエラー画面ですが、「Full Trace」をクリックするとコードがどのような順番で動いているか確認できます。とりあえず「一番上の行がエラーの起きているところ」です!password_digestがどうとか書いてあるのではないかと思います これが怪しいです! 「ArgumentError: wrong number of arguments (given 0, expected 1) password_digest」等で検索すると良いのではないかと思います。 ↑でもどうしても解決しそうになくて、もしまだあまり作り込んでいない段階なのであれば「今あるログイン機能を一旦捨てて、ユーザー周りを全てdeviseで作り直す」or「deviseを使わないでフォロー機能を作る」方が早いかもしれません…!
punchan36

2020/01/24 10:17

とんでもないです。知識の幅が広がりました! 「deviseを使わないでフォロー機能を作る」方をトライしてみます。時間がかかると申し訳ないので、未解決ですがベストアンサーとさせて頂きます。解決しましたら後日コメントに残しておきます。 またRuby関連で何かありましたらご回答をリクエストさせて頂くかもしれません。その際は宜しくお願い致します!
punchan36

2020/01/30 09:30

その後、全て無事解決致しました。 フォロー機能実装時に、参考にしたサイトにあるコードを頼り過ぎて鵜呑みにしてしまい、自分のController等でしっかり定義が出来ていなかった事が原因でした。ログインに関連するコードがフォロー機能にもあり、そこでログイン自体にも影響が出てしまったものと思われます。Deviseはアンインストールしましたが直接の原因ではなかったようです。 今後は一行一行意味を考え、既存(自分)のコードときちんと関連付け、統一感を持たせる様心掛けます。 怠慢さから来る原因で申し訳ありませんでしたが、また機会がありましたら是非宜しくお願い致します。
kyoruni

2020/02/04 12:51

無事解決できたようでよかったです!Deviseすごく便利なので、機会があれば是非使ってみてください!
punchan36

2020/02/09 23:33

有難うございます!:)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問