Как безопасно использовать переменную param для выполнения поиска по перечислению - PullRequest
1 голос
/ 09 июля 2020

Рассмотрим модель пользователя

# app/models/user.rb
class User
   enum status: [:sad, :bored, :happy]
end

В контроллере я хочу получить params[:status] и вернуть всех пользователей с этим статусом

т.е.

# app/controllers/users_controller.rb
class UsersController << ApplicationController
   def index_status
      status = "#{params[:status]}"
      if User.statuses.include? status
         @status = status.to_sym
         @countries = User.send(@status)
      else
        redirect_to root_path, notice: 'Invalid status'
    end
end

Это работает нормально, но Brakeman дает мне предупреждение dangerous send - User controlled method execution для строки

@countries = User.send(@status)

Есть ли способ сделать это, чтобы не было предупреждения от Brakeman.

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Из документов ActiveRecord :: Enum ...

Конечно, вы также можете запросить их напрямую, если области не соответствуют вашим потребностям:

@countries = User.where(status: @status)

Обратите внимание на это:

status = "#{params[:status]}"

Лучше записать как вызов #to_s.

status = params[:status].to_s

Но нет необходимости его строковить вообще .

status = params[:status]
0 голосов
/ 10 июля 2020

Согласно комментарию @Justin, это происходит потому, что Брейкман не понимает перечисления. Я открыл новую проблему для Brakeman и обновлю этот ответ, когда он будет решен.

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