Как использовать before_action с: if и params

oneWorkingHeadphone спросил: 28 апреля 2018 в 09:21 в: ruby-on-rails

У меня есть модуль авторизации, который я создал для авторизации действий пользователя. Все работает отлично, но теперь я хочу пропустить действие, если пользователь, запрашивающий страницу, является текущим пользователем. Ресурс вложен ниже 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 никогда не вызывается, поэтому разрешены все действия (я предполагаю, что оператор if всегда оценивает значение true), но я не могу проверить, что происходит, потому что если я прекратить выполнение там, никаких параметров, кажется, нет (что, я думаю, должно заставить его всегда оценивать значение false, а не true).

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

EDIT: Приведенный выше код действительно работает, если вы преобразуете params в целое число в соответствие с current_user.id

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

1 ответ

Есть решение
Gabbar ответил: 28 апреля 2018 в 03:02
  before_action do |controller|
    unless params[:user_id].to_i == current_user.id
      controller.authorize 
    end
  end

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

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

Вторая альтернатива

before_action :authorize, unless: -> { params[:user_id].to_i == current_user.id }
oneWorkingHeadphone ответил: 28 апреля 2018 в 10:06
Это работает, если вы вызываете .to_i для параметров. На самом деле, вызов lamda выше работает, если я добавлю это ... Спасибо, что поставили меня на правильный путь.
Gabbar ответил: 28 апреля 2018 в 10:18
@oneWorkingHeadphone Ну, я добавил ваш ответ на вызов ламды: D спасибо.
oneWorkingHeadphone ответил: 28 апреля 2018 в 10:37
вы должны вызвать .to_i, как я сделал в редактировании (как в вашем коде, так и в моем). `params [: user_id] возвращает строку, поэтому сравнение - это, например," 1 "== 1, которое не позволит текущему пользователю выполнять действия над собственными записями.