2014-12-14 3 views
0

У меня есть связь, как это:Извлечение PARAMS значения из ссылки, Rails 4

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

Я хочу, чтобы извлечь все Diferent значения переменных из этой ссылки. Например, sms-id, оператор, from, to и text.

До сих пор я так:

routes.rb

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

SMS # ПОЛУЧИТЬ контроллер

def receive 

    query = params[:params] 

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

     flash[:notice] = sms_id 

end 

Это дает мне: =7bb28e244189f2cf36cbebb9d1d4d02001da53ab& но мне нужно без first = и last characher &.

Если я пытаюсь добавить строки, как: query[/["sms-id"].+?[&operator]/], которые могли бы позволить мне извлечь все переменные гладко, он дает мне ошибку: empty range in char class: /["sms-id"].+?[&operator]/

Но я верю, что есть другой способ, чтобы извлечь все эти значения переменных в разных путях?

Заранее благодарен!

ответ

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)

Если у вас есть контролировать исходный URL-адрес, изменить последнее / на ? для еще более простого решения:

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'] 
+0

Эта последняя строка спасла мою жизнь :) – Edgars

1

Вам нужно

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

путь в routes.rb и получить params в контроллере

+0

Это дает мне 'Нет маршрутные матчи [не GET]«/ смс/получить/SMS-идентификатор = 7bb28e244189f2cf36cbebb9d1d4d02001da53ab & operator-% 20id = 1 & от = 37126300682 & к = 371144 & текст = RV9 + c + Dace + Reituma + 0580913 «Я пробовал это раньше ... – Edgars

+1

Можете ли вы изменить URL-адрес, чтобы исправить синтаксис: «/ sms/receive? Sms-id = 7bb28e244189f2cf36cbebb9d1d4d02001da53ab & operator-% 20id = 1 & f rom = 37126300682 & to = 371144 & text = RV9 + c + Dace + Reituma + 0580913" (добавить? Вместо/before params)? –

+0

Хороший, я понимаю свою проблему сейчас. Я могу получить доступ ко всем параметрам, кроме sms-id и operator-id, потому что эта строка в midle должна быть подчеркнута? – Edgars

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 & 

я предлагаю вам сделать метод в модели или помощника, а не написать весь код в контроллере.

+0

Выглядит неплохо, но когда я попытался, я получил ошибку 'undefined method' scan '' – Edgars

+0

Какой тип' params [: params] 'он должен быть строкой – Nermin

+0

И это строка. – Edgars

Смежные вопросы