从链接Rails 4中提取params值

时间:2014-12-14 12:40:42

标签: ruby-on-rails

我有这样的链接:

http://localhost:3000/sms/receive/sms-id=7bb28e244189f2cf36cbebb9d1d4d02001da53ab&operator-%20id=1&from=37126300682&to=371144&text=RV9+c+Dace+Reituma+0580913

我想从此链接中提取所有不同的变量值。例如sms-id,operator,from,to和text。

到目前为止,我有这样的想法:

的routes.rb

get 'sms/receive/:params', to: 'sms#receive'

SMS#RECEIVE控制器

def receive

     query = params[:params]

      sms_id=     query[/["="].+?[&]/]   

      flash[:notice] = sms_id

end

这给了我:=7bb28e244189f2cf36cbebb9d1d4d02001da53ab&但我需要没有第一个=和最后一个字符&

如果我尝试添加类似:query[/["sms-id"].+?[&operator]/]的字符串,可以让我顺利提取所有变量,则会给出错误:empty range in char class: /["sms-id"].+?[&operator]/

但我相信还有其他方法可以用不同的方式提取所有这些变量值吗?

提前致谢!

3 个答案:

答案 0 :(得分:1)

你需要

get 'sms/receive/', to: 'sms#receive' 

routes.rb中的路径,并在控制器中获取params

答案 1 :(得分:1)

正则表达式中的错误是因为-是中间方括号内的保留字符。在这种情况下,必须使用反斜杠进行转义:\-

要解析查询字符串,您可以执行以下操作:

sms_id = params[:params].match(/sms-id=([^&]*)/)[1]

或使用更通用的方法解析它:

parsed_query = Rack::Utils.parse_nested_query(params[:params])
sms_id = parsed_query['sms-id']

(引自this answer

如果您可以控制初始网址,请更改/的最后?,以获得更简单的解决方案:

http://localhost:3000/sms/receive?sms-id=7bb28e244189f2cf36cbebb9d1d4d02001da53ab&operator-%20id=1&from=37126300682&to=371144&text=RV9+c+Dace+Reituma+0580913

您将sms-id中的params

sms_id = params['sms-id']

答案 2 :(得分:0)

试试这个

matches = params[:params].scan(/(?:=)([\w\+]+)(?:\&)?/)
# this will make matches = [[first_match], [second_match], ..., [nth_match]]

# now you can read all matches

sms_id = matches[0][0]
operator_id = matches[1][0]
from = matches[2][0]
to = matches[3][0]
text = matches[4][0]
# and it will not contatin = or &

我建议您在模型或帮助器中创建方法,而不是在控制器中编写整个代码。