Я хочу перенаправить на определенную страницу при успешном входе. Может кто-нибудь может посоветовать мне, как перенаправить после проверки (userid == teacher). Если идентификатор пользователя является учителем, перенаправьте его на страницу учителя, в противном случае - на страницу ученика.

Pbl01 / конфигурации / routes.rb

Rails.application.routes.draw do
  devise_for :users, :controllers => {
    :registrations => 'users/registrations'
  }

  resources :import,only: [:index,:create]
  root 'root#index'

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

Pbl01 / приложение / контроллеры / пользователи / sessions_controller.rb

class Users::SessionsController < Devise::SessionsController
  def new
  end

  def create
    @user = User.new(user_params)

    if @user.save
      @userid = User.find_by(userid:params[:userid])

      if @userid.userid == 'teacher'
        redirect_to root_path
      else
       redirect_to timesset_path   
      end
    else
      flash[:notice] = "Invalid Username or Password"
      flash[:color]= "invalid"
      render "new"  
    end
  end
end

Pbl01 / приложение / модели / user.rb

require 'csv'

class User < ApplicationRecord
  validates :userid, :presence => true,
  validates :password, :presence => true,

  devise :database_authenticatable, :registerable,
       :recoverable, :rememberable, :trackable, :validatable

  def email_required?
    false
  end

  def self.import(file)
    CSV.foreach(file.path, headers: true) do |row|
      users = find_by(userid: row["userid"]) || new
      users.attributes = row.to_hash.slice(*updatable_attributes)
      users.password= row["password"]
      users.save!
    end
  end

  def self.updatable_attributes
    ["userid", "name", "email"]
  end
end

Pbl01 / приложение / просмотров / Завещание / сессии / new.html.erb

<h2>Log in</h2>

<%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
  <% if @user.errors.any? %>
    <div class="field">
      <%= f.label :userid %><br />
      <%= f.text_field :userid, autofocus: true %>
    </div>

    <div class="field">
      <%= f.label :password %><br />
      <%= f.password_field :password, autocomplete: "off" %>
      <% for message_error in @user.errors.full_messages %>
        <li>* <%= message_error %></li>
      <% end %>
    </div>

    <% if devise_mapping.rememberable? -%>
      <div class="field">
        <%= f.check_box :remember_me %>
        <%= f.label :remember_me %>
      </div>
    <% end -%>

    <div class="actions">
      <%= f.submit "Log in" %>
    </div>
  <% end %>

  <%= render "devise/shared/links" %>
0
Mohammad 29 Май 2017 в 05:47

2 ответа

Лучший ответ

Вы можете использовать метод after_sign_in_path_for (resource) devise.

def after_sign_in_path_for(resource)
 if resource.userid == 'teacher'
    teacher_path(resource.id)
 else
    student_path(resource.id)
 end
end
2
Sourabh Ukkalgaonkar 29 Май 2017 в 05:49

Я предлагаю вам добавить колонку для должности (если это студент или преподаватель). Таким образом, вы можете легко отсортировать успешного входа в систему и перенаправить его на соответствующую страницу, где он должен быть.

0
Shaido - Reinstate Monica 29 Май 2017 в 09:46