Как нажать «создать» вместо «новый» для сеанса в конвейере авторизации Rails? - PullRequest
0 голосов
/ 24 октября 2019

Я в растерянности, пытаясь понять, почему мой конвейер аутентификации Rails достигает только new, а не create. Это приводит к повторной визуализации страницы входа в систему и никогда не переходит на страницу search. Не могли бы вы взглянуть на мой код и посмотреть, что я могу пропустить?

Я использую bcrypt для хэширования атрибута пароля в user

Мой routes

Rails.application.routes.draw do
  root :to => "searches#search" 

  resources :users, only: [:show, :new, :create, :destroy]

  get '/login', to: 'sessions#new', as: 'login'
  post '/login', to: 'sessions#create'

  delete '/logout', to: 'sessions#destroy', as: 'logout'

  get 'searches/index' => "searches#index"
  get 'searches/show' => "searches#show"
  get 'searches/search' => "searches#search" 


  get 'audits/show' => 'audits#show'     
  get 'audits/download' => 'downloads#show' 
  post 'audits/' => 'audits#create'

  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end 

application_controller

class ApplicationController < ActionController::Base
  before_action :authorized #lock down this whole app
  helper_method :current_user #i can call current_user from a view

  def current_user
    User.find_by({ id: session[:user_id] })
  end

  def logged_in?
    !!current_user
  end

  def authorized
    redirect_to login_path unless logged_in?
  end

end

sessions_controller

class SessionsController < ApplicationController
  skip_before_action :authorized, only: [:new, :create]

  def new
  end

  def create
    #handles the POST request to /login
    @user = User.find_by(username: params[:username])
    if @user && @user.authenticate(params[:password])
      session[:user_id] = @user.id
      redirect_to @user
    else
      flash[:notice] = 'Invalid username or password'
      redirect_to login_path
    end
  end

  def destroy
    session.delete(:user_id)
    flash[:notice] = 'logged out'
    redirect_to login_path
  end

end

и форма входа в систему sessions/new.html.erb


<div class='login'>
    <div class="login-form">
        <form>
            <div class="form-group">
                <%= form_with url: login_path, method: 'post', local: true do |f|  %>
                    <%= f.label :username,  "Username", class: "col-md-4 control-label" %>
                    <%= f.text_field :username, class: "form-control", required: true %>
                    <%= f.label :password,  "Password", class: "col-md-4 control-label" %>
                    <%= f.password_field :password, class: "form-control", required: true %>
                    <%= f.submit "Login", class: "btn btn-default btn-primary" %>
                <% end %>
            </div>

        </form>
    </div>
</div>

Я пробовал form_tag также, но тот же вопрос. Я сделал метод явным, просто чтобы быть уверенным, хотя он не должен быть необходим.

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Итак, проблема заключалась в том, что у меня были form_with внутри Bootstrap <form> теги. Форма по умолчанию get.

0 голосов
/ 24 октября 2019

Вы можете изменить routes.rb на:

Rails.application.routes.draw do
  # codes
  resources :sessions, only: [:create]
  get '/login', to: 'sessions#new', as: 'login'
  delete '/logout', to: 'sessions#destroy', as: 'logout'
  # codes
end

И изменить тег формы на

<%= form_with url: sessions_path, method: 'post', local: true do |f| %>

Подробности вы можете проверить https://medium.com/@wintermeyer/authentication-from-scratch-with-rails-5-2-92d8676f6836

Спасибо.

...