использование нескольких перед действием в рельсах - PullRequest
1 голос
/ 09 мая 2020

я пытаюсь сделать маршрут частным, случай выглядит следующим образом: если пользователь хочет go 'galleries/:id', он перенаправит на gallery/login?id=:id и на этом gallery_login_path html, я создаю форму входа в эту галерею с требуемым PIN-кодом

route.rb:

  resources :galleries
  get 'gallery/login', to: 'galleries#login', as: 'gallery_login'
  post 'gallery/auth', to: 'galleries#auth', as: 'gallery_auth'

//

gallery GET    /galleries/:id
gallery_login GET    /gallery/login
gallery_auth POST   /gallery/auth

эта форма будет запускаться по URL: gallery_auth_path, метод, который используется следующим образом:

  def auth
    @error_login
    @gallery = Gallery.find_by(id: params[:gallery_id])
    if @gallery.pin.nil?
      redirect_to "galleries/#{@gallery.id}"
    elsif  @gallery.pin == params[:pin] && @gallery.expired_pin.past?
      @error_login = 'PIN expired'
    elsif @gallery.pin == params[:pin] && !@gallery.expired_pin.past?
      redirect_to "/galleries/#{@gallery.id}"
      true
    else
      @error_login = 'PIN not match'
    end
    @error_login = 'Required PIN' unless params[:pin].present?
    if @error_login.present?
      respond_to do |format|
        @error_login
        format.js {render 'galleries/error_login' , layout: false}
      end
    end
  end

на login.html.haml:

    = form_with url: gallery_auth_path do |f|
      = hidden_field_tag :gallery_id, "#{params[:id]}"
      .form-group.row
        = f.label :pin, class: 'col-sm-2 col-form-label text-center'
        .col-sm-4.col-md-4.col-xs-4
          = f.text_field :pin, class: 'form-control', placeholder: 'PIN'
      .form-group
        .col-sm-4
          = f.submit 'Login', data: {disable_with: 'Loading...'}, class: 'btn btn-primary '

, когда пользователь вводит неправильный PIN-код, появляется сообщение об ошибке при входе в систему. html работает нормально, но когда PIN-код правильный, он не может срабатывать на ' galleries /: id '

в моем galleries_controller:

before_action :authenticate, only: [:show]
  def login
  end 

  def auth
    // method on above 
  end

  private 

  def authenticate
    redirect_to "/gallery/login?id=#{params[:id]}"
  end

я неправильно использую before_action для этого случая? есть ли способ исправить это? потому что в форме входа в галерею после того, как пользователь ввел правильный пин-код, он не может срабатывать на 'galleries /: id', потому что oif before_action я ставлю,

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

Вопрос сложно понять ... вы хотите использовать несколько before_actions? Для этого просто добавьте больше правил.

before_action :authenticate, only: [:show]
before_action :is_admin?, only: [:create]

Кроме того, в первом комментарии к вашему сообщению говорится, что у вас нет действия show. Где это, ваша аутентификация будет вызываться только перед этим действием.

0 голосов
/ 09 мая 2020

Замените params[:pin] на params[:gallery][:pin] в методе контроллера

routes.rb

get 'gallery/login', to: 'galleries#login', as: 'gallery_login'
post 'gallery/auth', to: 'galleries#auth', as: 'gallery_auth'
resources :galleries 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...