Почему link_to с абсолютным url считается технически превосходящим целевое действие контроллера?

63
4

Новое для рельсов, поэтому, если это обсуждается где-то, просто соедините меня: у меня был хороший поиск, но все, что я мог найти, это люди, пытающиеся выяснить, как использовать link_to, а не обсуждение этого комментария:

link_to "Profile", profile_path(@profile)
# => <a href="/profiles/1">Profile</a>

in place of the older more verbose, non-resource-oriented

link_to "Profile", :controller => "profiles", :action => "show", :id => @profile
# => <a href="/profiles/show/1">Profile</a>

http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to

Я понимаю, что последнее более подробное и, следовательно, нежелательное, но первое кажется странным, что нужно рекомендовать.

Если у меня есть действие, скажите: /blah/add и я ссылаюсь на него, используя:

link_to "Link", link_add_path

Затем я связываюсь с mysite.com/link/add. Это жесткий код.

Если я изменю маршрут, на который это сопоставляется, я должен изменить каждый экземпляр link_to в моей базе кода, чтобы указать на новый абсолютный URL-адрес. Это кажется сумасшедшим.

Однако, если я ссылаюсь на него, используя:

link_to "Link", :controller => "thing", :action => "add"

Затем URL-адрес динамически определяется. Если мне нужно изменить путь, все, что я делаю, это отредактировать config/routes.rb и не трогать ни один из моих кодов. Это похоже на гораздо более низкое обслуживание.

Я считаю, что это немного сложнее, поэтому переменная blah_path на самом деле не является статическим маршрутом, и на самом деле содержит некоторые смайлы, такие как URL-адрес базы приложений и не позволяет вам ссылаться на URL-адреса, которых не существует, но это похоже на шаг назад упростить дробно менее подробный синтаксис.

Итак, что с этим?

Какую техническую причину вы бы выбрали бывшим синтаксисом link_to над последним?

спросил(а) 2021-01-19T16:46:12+03:00 6 месяцев, 2 недели назад
1
Решение
90

"Вы делаете это неправильно": P

Серьезно, хотя: используйте именованные ресурсы, и вот почему это круто:

Пример: вы получили это в своем файле маршрутов:

    resources :user_orders

И вы используете "user_orders_path" повсюду. Затем вы делаете рефакторинг и решаете (потому что заказы теперь общие), что вы хотите, чтобы контроллер назывался "заказы", но вы не хотите разорвать весь свой старый код. вы можете сделать это:

    resources :user_orders, controller: "orders"

И ваши существующие ссылки будут продолжать работать! (плюс вы можете добавить ресурс "заказы", чтобы переместить вещи на новую схему)

Там также такие аккуратные вещи, как именованные ссылки:

    match 'exit' => 'sessions#destroy', :as => :logout

Я также хотел бы добавить, если вам нужно было реорганизовать ваш контроллер с использованием старого синтаксиса ссылок - вам все равно придется менять кучу ссылок на контроллер!

ответил(а) 2021-01-19T16:46:12+03:00 6 месяцев, 2 недели назад
46

Затем я связываюсь с mysite.com/link/add. Это жесткий код.

Нет, нет. link_add_path - это метод, созданный Rails, который указывает на определенный маршрут в вашем config/routes.rb. Вы можете увидеть это, выполнив

rake routes | grep link_add

Если я изменю маршрут, на который это сопоставляется, я должен изменить каждый экземпляр link_to в моей базе кода, чтобы указать на новый абсолютный URL-адрес. Это кажется сумасшедшим.

Нет, нет. Возьмем следующий пример

get "link/add", as: :link_add, controller: :links, action: :add

Если я запустил выше

rake routes | grep link_add

я получил

link_add GET    /link/add(.:format)    links#add

Но что, если я изменю имя моего контроллера на UrisController? Просто измените маршрут в config/routes.rb

get "link/add", as: :link_add, controller: :uris, action: :add

и теперь у вас есть

link_add GET    /link/add(.:format)    uris#add

link_to не link_to в изменении, потому что метод link_add_path по-прежнему отображается на недавно измененную строку в моей config/routes.rb потому что имя маршрута одинаково. С помощью вашего более явного способа указания контроллеров/действий для каждого link_to вам необходимо пройти через каждую ссылку и обновить ее вручную, чтобы отразить новый controller: :uris controller.

Читайте о маршрутах именования маршрутов в направляющих.

ответил(а) 2021-01-19T16:46:12+03:00 6 месяцев, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема