Techioz Blog

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])
    # ...