Передать значение параметра другому контроллеру, используя сеанс - PullRequest
0 голосов
/ 07 марта 2019

Можно ли в любом случае передать значение параметра другому действию, например сеансу?Например, чтобы пользователь мог перейти на следующую страницу и так далее, ему необходимо ввести код доступа.Поэтому, если они попытаются изменить URL, чтобы пропустить ввод кода доступа, они будут перенаправлены.Поэтому я пытаюсь сохранить код доступа в сеансе

def welcome_access
    @code = params[:access_code] == ENV['ACCESS_CODE']
    session[:passed_parameter] = @code
    if @code
        redirect_to users_welcome_path
      else
        flash[:alert] =  "Incorrect access code"
        redirect_to  request.referer
    end

    respond_to do |format|
    format.html
    format.js
    end
  end

  def welcome_submit
    @code = session[:passed_parameter]
    @welcome_code = @code
      if @welcome_code
        if params[:user_type] == "patient"  
          redirect_to new_patient_path
        elsif params[:user_type] == "surrogate" 
          redirect_to surrogate_patients_path
        elsif params[:user_type] == "surrogate"
          redirect_to new_patient_path
        elsif params[:user_type] == "provider"
          redirect_to new_provider_path
        elsif params[:user_type] == "facilitator"
          redirect_to new_facilitator_path
        elsif params[:user_type] == "ancillary"
          redirect_to new_ancillary_path
        elsif params[:user_type] == "administrator"
          redirect_to new_administrator_path
        elsif params[:user_type] == "emergency"
          redirect_to new_emergency_path
        elsif params[:user_type] == "paramedic"
          redirect_to new_paramedic_path
        end
      else
      redirect_to request.referer
    end
  end

, вот мой модальный код

<div class="modal-box">
    <%= form_tag users_welcome_access_path, method: :post do %>
        <div class="close">x</div>
        <div class="title">Access Code</div>
        <div id="modal-container" class="container sm-height">
             <div class="buttons">
                  <div class="header">
                    <%= label :access_code, "Enter correct access code to continue registration"%>
                    <%= text_field_tag :access_code %>
                  </div>
                  <div class="header" style="margin-top: 15px">
                    <%= submit_tag 'Continue', class: "btn-submit" %>
                  <button class="btn-cancel">Cancel</button>
                 <div class="push"></div>
                     </div>
            </div>
        </div>
    <% end %>
</div>

1 Ответ

0 голосов
/ 08 марта 2019

Вы, вероятно, хотите выполнить авторизацию / перенаправление с перед фильтром . Эти фильтры позволяют вам определять методы, которые должны вызываться перед каждым методом контроллера. Инструменты аутентификации, как правило, используют их довольно сильно, поскольку они позволяют вам проверить, прошел ли пользователь аутентификацию, прежде чем вы доберетесь до сути вашего метода.

Например:

class MyController < ApplicationController
  before_action :authenticate!

  # authenticate! is automatically called before this method
  def welcome_access
    # user is already authenticated at this point, or else was redirected to request.referer
    respond_to do |format|
      # ...
    end
  end

  # authenticate! is automatically called before this method
  def welcome_submit
    # user is already authenticated at this point, or else was redirected to request.referer
    case params[:user_type]
    when "patient" then redirect_to new_patient_path
    # more redirects here...
    when "paramedic" then redirect_to new_paramedic_path
    end
  end

  private

  def authenticate!
    session[:passed_parameter] = params[:access_code] if params[:access_code].present?
    if !correct_code?
      flash[:alert] =  "Incorrect access code"
      redirect_to request.referer
    end
  end

  def correct_code?
    session[:passed_parameter] == ENV['ACCESS_CODE']
  end
end

Несколько других замечаний / предложений:

  • Попробуйте использовать case / when вместо длинной цепочки if - elsif. Смотрите мой пример.

  • Response_to в welcome_access никогда не получает удар, потому что вы всегда будете перенаправлены в первую очередь. Либо иметь приветственный доступ, перенаправить на другую страницу, либо сделать HTML.

  • Вместо redirect_to request.referer, предпочитайте redirect_back

  • Возможно, вы захотите взглянуть на некоторые драгоценные камни, которые обрабатывают аутентификацию для вас. Devise является мощным камнем общего назначения для этого. Люди редко применяют свою собственную аутентификацию на практике (если, скажем, они просто не делают это, чтобы учиться), и обучение использованию драгоценных камней в вашем проекте - это хороший навык, который должен быть сам по себе. Конечно, это более безопасно.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...