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

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

ただいまの
回答率

91.37%

  • Ruby on Rails

    5044questions

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

Railsでgemを使わずにログイン機能を作りたい

受付中

回答 0

投稿 2017/11/28 16:55

  • 評価
  • クリップ 0
  • VIEW 41

matsuo

score 50

いつもお世話になっております。
こちらのサイトを参考に、Rails5でログイン機能を作っています。
最初にログイン処理をはさみ、通過するとhome#indexに飛ばしたいです。
しかしうまくかず、またどのあたりが間違っているのかもわかりません。
そして、新規登録のページに行けず困っております。
以下がサイトを参考にして作ったものです。

#routes.rb
Rails.application.routes.draw do

  match '',       to:'home#index',  via:'get',  as:'root'

  #login
  match 'login',   to: 'sessions#new',     via:'get'
  match 'login',   to: 'sessions#create',  via:'post'
  match 'logout',  to: 'sessions#destroy', via:'delete'

  scope :home do
    match '/show',   to:'home#show',    via:'get',  as:'home_show'
  end


  scope :users do
    match '',         to:'users#index',   via:'get',   as:'users'
    match '/new',     to:'users#new',     via:'get',   as:'users_new'
    match '/create',  to:'users#create',  via:'post',  as:'users_create'
    match '/edit',    to:'users#edit',    via:'get',   as:'users_edit'
    match '/update',  to:'users#update',  via:'post',  as:'users_update'
    match '/delete',  to:'users#delete',  via:'get',   as:'users_delete'
  end

end
#application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  before_action :current_user
  before_action :require_sign_in!
  helper_method :signed_in?


  def current_user
    remember_token = User.encrypt(cookies[:user_remember_token])
    @current_user ||= User.find_by(remember_token: remember_token)
  end

  def sign_in(user)
    remember_token = User.new_remember_token
    cookies.permanent[:user_remember_token] = remember_token
    user.update!(remember_token: User.encrypt(remember_token))
    @current_user = user
  end

  def sign_out
    @current_user = nil
    cookies.delete(:user_remember_token)
  end

  def signed_in?
    @current_user.present?
  end

  private

    def require_sign_in!
      redirect_to login_path unless signed_in?
    end

end
#users_controller.rb
class UsersController < ApplicationController
  def index
  end

  def new
    @user = User.new(user_params)
  end

  def create
    @user = User.new(user_params)
    if @user.save
      redirect_to users_new_path
    else
      render 'new'
    end
  end

  def edit
  end

  def update
  end

  def delete
  end

  private

  def user_params
    params.require(:user).permit(:user_name, :password, :password_confirmation)
  end

end
#sessions_controller.rb
class SessionsController < ApplicationController
  # skip_before_action :require_sign_in!, only: [:new, :create]
  before_action :require_sign_in!, [:destroy]
  before_action :set_user, only: [:create]

  def new
  end

  def create
    if @user.authenticate(session_params[:password])
      sign_in(@user)
      redirect_to root_path
    else
      flash.now[:danger] = t('.flash.invalid_password')
      render 'new'
    end
  end

  def destroy
    sign_out
    redirect_to login_path
  end

  private

  def set_user
    @user = User.find_by!(user_name: session_params[:user_name])
  rescue
    flash.now[:danger] = t('.flash.invalid_user_name')
    render action: 'new'
  end

  # 許可するパラメータ
  def session_params
    params.require(:session).permit(:user_name, :password)
  end
end
#user.rb
class User < ApplicationRecord
  has_secure_password validations: true
  validates :user_name, presence: true, uniqueness: true

  def self.new_remember_token
    SecureRandom.urlsafe_base64
  end

  def self.encrypt(token)
    Digest::SHA256.hexdigest(token.to_s)
  end
end
<!--users/new.html-->
<h1>新規登録</h1>
<%= form_for(:user, url: users_path) do |f| %>
  <%= f.label :user_name %>
  <%= f.text_field :user_name %>

  <%= f.label :password %>
  <%= f.text_field :password %>

  <%= f.label :password_confirmation %>
  <%= f.text_field :password_confirmation %>
  <%= f.submit "登録"%>
<% end %>
<!--sesstions/new.html-->
<% provide(:title, "Log in") %>
<h1>ログイン</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_for(:session, url: login_path) do |f| %>

      <%= f.label :user_name %>
      <%= f.text_field :user_name, class: 'form-control' %>

      <%= f.label :password %>
      <%= f.password_field :password, class: 'form-control' %>

      <%= f.submit "ログイン", class: "btn btn-primary" %>
    <% end %>

    <p>初めての方は <%= link_to "こちら", users_path %> から新規登録を行なってください</p>
  </div>
</div>


初歩的な質問で申し訳ないですが、ご教授いただければと思います。
どうぞよろしくお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • scivola

    2017/11/30 04:49

    うまくいかない,というのは,どんな操作をやったときにどんな結果を期待して,どんな結果になったということでしょうか。

    キャンセル

まだ回答がついていません

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

ただいまの回答率

91.37%

関連した質問

同じタグがついた質問を見る

  • Ruby on Rails

    5044questions

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