Ответ 1
Вы можете просто использовать:
ActiveRecord::Base::sanitize(string)
Мне нужно дезинформировать часть SQL-запроса. Я могу сделать что-то вроде этого:
class << ActiveRecord::Base
public :sanitize_sql
end
str = ActiveRecord::Base.sanitize_sql(["AND column1 = ?", "two's"], '')
Но это не безопасно, потому что я выставляю защищенный метод. Что это лучший способ сделать это?
Вы можете просто использовать:
ActiveRecord::Base::sanitize(string)
ActiveRecord::Base.connection.quote
делает ActiveRecord::Base.connection.quote
дело в Rails 3.x
Этот вопрос не указывает, что ответ должен исходить от ActiveRecord
и не указывает, для какой версии Rails он должен быть. По этой причине (и потому что это один из лучших и немногих) ответов о том, как очистить параметры в Rails...
Вот решение, которое работает с Rails 4:
В ActiveRecord::Sanitization::ClassMethods
вас есть sanitize_sql_for_conditions и два других его псевдонима: sanitize_conditions и sanitize_sql. Три делают буквально то же самое.
sanitize_sql_for_conditions
Принимает массив, хэш или строку условий SQL и очищает их в допустимый фрагмент SQL для предложения WHERE.
Также в ActiveRecord у вас есть
sanitize_sql_for_assignment
который
Принимает массив, хэш или строку условий SQL и очищает их в допустимый фрагмент SQL для предложения SET.
Кроме того, однако, в ActionController у вас есть ActionController::Parameters
который позволяет вам
выберите, какие атрибуты должны быть внесены в белый список для массового обновления и, таким образом, предотвратить случайное раскрытие того, что не должно быть выставлено. Предоставляет два метода для этой цели: требовать и разрешать.
params = ActionController::Parameters.new(user: { name: 'Bryan', age: 21 })
req = params.require(:user) # will throw exception if user not present
opt = params.permit(:name) # name parameter is optional, returns nil if not present
user = params.require(:user).permit(:name, :age) # user hash is required while 'name' and 'age' keys are optional
"Магия параметров" называется "Сильные параметры" (здесь приведены документы), и вы можете использовать ее для очистки параметров в контроллере перед его отправкой в модель.
ActionController::Base
и, следовательно, включены в любой контроллер Rails.Я надеюсь, что это поможет любому, хотя бы для изучения и демистификации Rails! :)
Вы можете обойти метод protected
метода, косвенно косвенно:
str = ActiveRecord::Base.__send__(:sanitize_sql, ["AND column1 = ?", "two's"], '')
... который по крайней мере избавит вас от необходимости переделать этот метод как public
.
(Я немного подозрительно, что вам действительно нужно это сделать, но выше будет работать.)
Начиная с рельсов 5 рекомендуемым способом является использование: ActiveRecord::Base.connection.quote(string)
как указано здесь: https://github.com/rails/rails/issues/28947
ActiveRecord::Base::sanitize(string)
устарела