ログインを実装するのにdeviseを用いました。
ログインに失敗した時にエラーメッセージを出したいのでコントローラーをカスタマイズしました。
sessions_controller.rb
def new @user = User.new end def create @user = User.find_by(email: session_params[:email], encrypted_password: session_params[:encrypted_password]) if @user redirect_to :root else @error_message = "エラー" @email = params[:email] @encrypted_password = params[:encrypted_password] render "devise/sessions/new" end end private def session_params params.permit(:email, :encrypted_password) end end
sessions/new.html.haml
.xxx %h2 ログイン = form_for(user_session_path) do |f| - if @error_message .aaa = @error_message .eee = f.label :email %br/ = f.email_field :email, autofocus: true, autocomplete: "email", class: "bbb" .eee = f.label :password %br/ = f.password_field :password, autocomplete: "current-password", class: "ccc" - if devise_mapping.rememberable? .eee = f.check_box :remember_me = f.label :remember_me .nnn = f.submit "Log in", class: "ddd"
このようにするとログインボタン押した時にアドレスとパスワードは合っているのにエラーメッセージが出ます。
一度コントローラーをカスタマイズする前に戻すとちゃんとログイン出来ています。
そして、new.html.hamlの3行目を
= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f|
に変えると(カスタマイズする前の記述)
ArgumentError in Users::Sessions#create First argument in form cannot contain nil or be empty
このエラーが出ます。
= form_for(user_session_path) do |f|
元の記述に戻してからログインすると何故かログイン出来ます。
でも、ログアウトしてまたログインすると出来なくなっています。
何日も悩んでいるので、ご教授頂けると嬉しいです…!
よろしくお願いします。
#補足
回答ありがとうございます。
親メソッドの呼び出しはよく分からなかったので、色々調べてみたのですが…
class A def new @user = User.new end end class B < A def create @user = User.find_by(email: session_params[:email], encrypted_password: session_params[:encrypted_password]) if @user redirect_to :root else @error_message = "エラーです" @email = params[:email] @encrypted_password = params[:encrypted_password] render "devise/sessions/new" end end end private def session_params params.permit(:email, :encrypted_password) end end
defの上にクラスを付け足しましたが、こういうことでしょうか?
こうするとエラーメッセージは出ず、ログインも出来ません…。
回答2件
あなたの回答
tips
プレビュー