Rails плавают как идентификатор в URI, кажется, теряет десятичную при преобразовании из строки - PullRequest
2 голосов
/ 16 февраля 2012

Это неправильно / невозможно передать число с плавающей точкой в ​​качестве идентификатора в RAILS 2.x

http://mysite.com/clientversioncheck/1.1

контроллер:

def clientversioncheck
  current_version = 1.1
  client_version = params[:id].to_f
  if client_version && current_version > client_version
    render :text => "update url"
  else
    render :text => "no update " + current_version.to_s + "server vs. " + client_version.to_s, :status => 404
  end
end

Если яСравнивая целое число, это всегда хорошо, но если я передаю число с плавающей запятой в виде строки, преобразование всегда отбрасывает десятичную часть.

Так что, если current_version = 1.0 и я передаю 1.0 в URL, все в порядке, если current_version =1.1 и я передаю 1.1 в URL-адресе client_version превращается в 1.0.

Я думал.не нужно экранировать в URI

Если я все сводю к следующему:

def clientversioncheck
  render :text => params[:id]
end

Я получаю усечение еще

Например: clientversioncheck / 2.33 выведет2

Я пробовал следующие маршруты:

  map.resources :api, :id => /[A-Za-z0-9\.]+?/, :format => /json|xml|plist|html/

  map.resources :api, :requirements => { :resource => /.*/ }

1 Ответ

1 голос
/ 23 февраля 2012

Вы должны получить некоторые более слабые требования к системе маршрутизатора, как в этом:

направляет маршрутизацию и параметры с '.'в них

Способ сделать это - использовать :requirements так или иначе.

map.resources не понимает опцию :id или :requirements, поэтому эти два не будут работать:

map.resources :api, :id => /[A-Za-z0-9\.]+?/, :format => /json|xml|plist|html/
map.resources :api, :requirements => { :resource => /.*/ }

map.resources, хотя и принимает хэш опций, поэтому вы не получите ошибкукогда вы передаете ему параметры, которые он не понимает.

Самое простое, что нужно сделать, это определить дополнительный маршрут вне map.resources, который разрешает точку в :id.Примерно так:

map.resources :api
map.connect '/apiv3/:action/:id', :controller =>'apiv3', :id => /.*/ # or whatever regex works for you

Или:

map.resources :api
map.connect '/apiv3/:action/:id', :controller =>'apiv3', :requirements => { :id => /.*/ }

Вы можете поставить map.connect до или после map.resources.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...