我正在尝试使用限制和偏移查询参数来实现一种分页形式。有没有办法确保值是整数否则抛出400错误,可能使用strong_parameters?它看起来像铁轨中的内容,但我找不到任何东西。
我可以手动转换查询参数,但如果可能的话,我宁愿使用更多防弹的东西。
答案 0 :(得分:12)
与上面的评论者@Litmus一样,我建议使用像kaminari这样的Ruby gem来管理分页。
但是如果你自己开始滚动,并且你关心输入清理,那么确保“offset”和“limit”参数是整数的最简单的方法可能是你的控制器中的过滤器:
class YourController < ApplicationController
before_filter :sanitize_page_params
# ... other controller methods ...
private
def sanitize_page_params
params[:offset] = params[:offset].to_i
params[:limit] = params[:limit].to_i
end
# ... etc. ...
end
请注意,"foo"
等字符串将转换为0
。
答案 1 :(得分:2)
您基本上需要手动转换参数。理想情况下,将其抽象为控制器方法,以保持实际方法的清洁。
Class SomeController < ActionController
before_filter: cleanup_pagination_params
def cleanup_pagination_params
params[:offset] = params[:offset].to_i
params[:limit] = params[:limit].to_i
end
# Your regular controller methods here
end
答案 2 :(得分:0)
尝试一下:修复转换为字符串的数字参数值
repair_nested_params({id: '11', age: '25'}) # Sample
def repair_nested_params(obj)
obj.each do |key, value|
obj[key] = parse_string(value)
end
end
def parse_string(value)
return repair_nested_params(value) if value.is_a?(Hash)
return value.map(&method(:repair_nested_params)) if value.is_a?(Array)
return value unless value.is_a?(String)
is_numeric = value.match?(/\A[-+]?\d*\.?\d+\z/)
return value unless is_numeric
(value.to_f % 1).positive? ? value.to_f : value.to_i
end