Как использовать before_action с: never и params - PullRequest
0 голосов
/ 22 мая 2018

У меня есть модуль авторизации, который я создал для авторизации действий пользователя.Все работает отлично, за исключением того, что теперь я хочу пропустить действие, если пользователь, запрашивающий страницу, является текущим пользователем.Ресурс вложен ниже user, поэтому передается :user_id как часть параметров.

Из того, что я смог выяснить, самый простой способ сделать это - использовать лямбду, но не похоже, что у меня есть доступ к переданным параметрам из фильтра before.

Это мой контроллер

class Certifications::FitnessController < ApplicationController
  prepend_before_action :authenticate_user!
  before_action :authorize, unless: -> { params[:user_id] == current_user.id }
end

Проблема в том, что :authorize before_action никогда не вызывается, поэтому все действия разрешены (я полагаю, потому что выражение "Always" всегда оценивается как true), но яне могу понять, что происходит, потому что, если я остановлю выполнение там, никакие параметры не появятся там (что, я думаю, должно сделать его всегда ложным, не истинным).

Если кто-то может сказать мне либочто я делаю неправильно или лучший способ реализации, я был бы очень признателен.

РЕДАКТИРОВАТЬ: Код выше на самом деле работает, если вы преобразуете параметры в целое число, чтобы соответствовать current_user.id

before_action :authorize, unless: -> { params[:user_id].to_i == current_user.id }

1 Ответ

0 голосов
/ 22 мая 2018
  before_action do |controller|
    unless params[:user_id].to_i == current_user.id
      controller.authorize 
    end
  end

В качестве альтернативы вы можете сделать так: -

before_action :authorize

def authorize
  unless params[:user_id].to_i == current_user.id
    #do your stuff..
  end
end

2-й вариант

before_action :authorize, unless: -> { params[:user_id].to_i == current_user.id }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...