Rails自动将查询字符串参数转换为整数

时间:2013-12-03 04:22:07

标签: ruby-on-rails ruby-on-rails-4

我正在尝试使用限制和偏移查询参数来实现一种分页形式。有没有办法确保值是整数否则抛出400错误,可能使用strong_parameters?它看起来像铁轨中的内容,但我找不到任何东西。

我可以手动转换查询参数,但如果可能的话,我宁愿使用更多防弹的东西。

3 个答案:

答案 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