Railsで簡単なログインページを作成できません
概要
ルート.rb
Rails.application.routes.draw do
get '/login' , to: 'sessions#new'
post '/login', to: "sessions#create"
end
セッションコントローラー.rb
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
log_in user
redirect_to user
else
flash.now[:danger]='Invalid login id'
render 'new'
end
end
def destroy
log_out
redirect_to root_url
end
end
ビュー/セッション/new.html.erb
<%= form_with url: login_path, local: true do |form| %>
<%= form.label :email %>
<%= form.email_field :email %>
<%= form.label :password %>
<%= form.password_field :password %>
<%= form.submit "LogIn"%>
<% end %>
Error:
NoMethodError in SessionsController#create
undefined method `[]' for nil:NilClass
Extracted source (around line #6):
5.def create
6. user = User.find_by(email: params[:session][:email].downcase)
7. if user && user.authenticate(params[:session][:password])
なぜこんなことが起こるのか、まだ理解できません。
自分で解決しようとあらゆることを試みましたが、できません。
解決策
form_with ヘルパーを URL で使用していますが、クラスのインスタンスでは使用していません。これはあなたのユースケースではまったく問題ありませんが、パラメータをネストしないように設定します。
create メソッドから [:session] ネストを削除すると、機能するはずです。
def create
user = User.find_by(email: params[:email].downcase)
if user && user.authenticate(params[:password])
# ...