Ruby on rails 如何从rails中的字符串中提取多个整数

Ruby on rails 如何从rails中的字符串中提取多个整数,ruby-on-rails,ruby-on-rails-3,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 3,Ruby On Rails 4,我的url中有以下内容。为了搜索,我需要分别提取4和2。这两个整数,一个是类别id,另一个是子类别id params[:id].scan(/\d+$/).first 使用上面的扫描,我可以得到4,但是我如何才能得到多个整数呢 my-url-for-test-4-2 我已经创建了一个助手方法 def string_to_int(param,key) param.scan(/\d+/).map(&:to_i).key end 我就这样从我的控制器上试过 id = str

我的url中有以下内容。为了搜索,我需要分别提取4和2。这两个整数,
一个是类别id
,另一个是
子类别id

params[:id].scan(/\d+$/).first
使用上面的扫描,我可以得到
4
,但是我如何才能得到多个整数呢

my-url-for-test-4-2
我已经创建了一个助手方法

  def string_to_int(param,key)
    param.scan(/\d+/).map(&:to_i).key
  end
我就这样从我的控制器上试过

id = string_to_int(params[:id],'first')
但得到的错误是

undefined method `key' for [4, 2]:Array

为什么不是接受。答案在于你的问题
params[:id].scan(/\d+/).map(&:to_i)

params[:id]。扫描(/\d/)
将生成数组。

答案取决于您的问题
params[:id]。扫描(/\d/)
将生成数组。

如果您将
第一个
最后一个
作为

   def string_to_int(param,key)
     param[:id].scan(/\d+/).map(&:to_i).send(key)
   end

如果您将
第一个
最后一个
作为
键传递:

   def string_to_int(param,key)
     param[:id].scan(/\d+/).map(&:to_i).send(key)
   end

您可以匹配
:id
参数中的最后两个数字部分(用连字符分隔):

string = params[:id].to_s
ids = string.scan(/-(\d+)-(\d+)$/)[0] # .try(:map, &:to_i)
更新:

这是一个不太边缘的案例,可以很好地处理:

a = "random1-2string-3-4-5"
a.scan(/-(\d+)-(\d+)$/)                        # => [["4", "5"]]
a.scan(/-(\d+)-(\d+)$/)[0]                     # => ["4", "5"]
a.scan(/-(\d+)-(\d+)$/)[0].try(:map, &:to_i)   # => [4, 5]

您可以匹配
:id
参数中的最后两个数字部分(用连字符分隔):

string = params[:id].to_s
ids = string.scan(/-(\d+)-(\d+)$/)[0] # .try(:map, &:to_i)
更新:

这是一个不太边缘的案例,可以很好地处理:

a = "random1-2string-3-4-5"
a.scan(/-(\d+)-(\d+)$/)                        # => [["4", "5"]]
a.scan(/-(\d+)-(\d+)$/)[0]                     # => ["4", "5"]
a.scan(/-(\d+)-(\d+)$/)[0].try(:map, &:to_i)   # => [4, 5]

您的意思可能是
.send(key)
(使用传递的参数名调用方法),而不是调用方法
key()
。请注意只扫描数字子字符串。这将返回
[1,2,3,4,5]
如果您有URL段
random1-2string-3-4-5
@kristinalim如何克服这种复杂性,请查看我的答案。它包括在行尾进行匹配(
$
),包括正则表达式中的连字符(另一个分隔符不应该起作用),以及扫描最后两个小数。您可能是指
.send(key)
(使用传递的参数名调用方法),而不是调用方法
key()
。在扫描数字子字符串时要小心。这将返回
[1,2,3,4,5]
如果您有URL段
random1-2string-3-4-5
@kristinalim如何克服这种复杂性,请查看我的答案。它包括在行尾进行匹配(
$
),包括正则表达式中的连字符(另一个分隔符不起作用),以及扫描最后两个小数。