Подтвердить что ты не робот

В чем разница между использованием "to:" и fat-arrow "=>" в маршрутизации Rails?

В учебнике RailsGuides маршрутизации, они дают следующий пример того, как создать простой маршрут, используя to хэша аргумента:

get '/patients/:id', to: 'patients#show'

Но когда вы создаете новое приложение Rails (используя Rails 4.0.3) с rails new командой rails new, файл config/routes.rb генерирует следующий пример простого маршрута, используя разделитель хеш-ключа/значения =>

get 'products/:id' => 'catalog#view'

Существуют ли какие-либо различия между этими различными методами для определения маршрута, или они одно и то же? Документация Rails буквально говорит об этом:

match 'path' => 'controller#action'
match 'path', to: 'controller#action'
match 'path', 'otherpath', on: :member, via: :get

То есть, это ничего не объясняет.

4b9b3361

Ответ 1

Там нет функциональной разницы между использованием to VS => определить маршрут в Rails. Внутри методы маршрутизации фактически преобразуют аргументы маршрута формы

<method> '<path>' => '<controller>#<action>'

к этой форме

<method> '<path>', to: '<controller>#<action>'

Исходный код

Вот фактический источник, который выполняет преобразование (из Rails 4.0.4), в ActionDispatch::Routing::Mapper::Resources. Обратите внимание, что каждый из методов маршрутизации get, post и т.д. В конечном итоге передает свои аргументы через этот метод match (комментарии мои):

def match(path, *rest)
  # This if-block converts '=>' to 'to'.
  if rest.empty? && Hash === path
    options  = path
    # The 'find' method will find the first hash key that is a string
    # instead of a symbol, e.g. ''welcome/index' => 'welcome#index'' instead
    # of 'to: 'welcome#index''. By parallel assignment, 'path' then becomes
    # the value of the key, and 'to' is assigned the value
    # (the controller#action).
    path, to = options.find { |name, _value| name.is_a?(String) }
    # The following two lines finish the conversion of '=>' to 'to' by adding
    # 'to' to the options hash, while removing the
    # ''welcome/index' => 'welcome#index'' key/value pair from it
    options[:to] = to
    options.delete(path)
    paths = [path]
  else
    options = rest.pop || {}
    paths = [path] + rest
  end
  # More Code...
end