Rails: Проверьте вывод помощника пути из консоли

290

Rails определяет набор магии с именованными маршрутами, которые делают помощников для ваших маршрутов. Иногда, особенно с вложенными маршрутами, может быть немного запутанным, чтобы отследить, какой URL вы получите для данного вызова метода вспомогательного маршрута. Можно ли с помощью консоли Ruby увидеть, какую ссылку сгенерирует данная вспомогательная функция? Например, учитывая именованный помощник, такой как post_path (post), я хочу посмотреть, какой URL генерируется.

Дерек Турн
источник

Ответы:

424

Вы можете показать их с rake routes напрямую.

В консоли Rails вы можете позвонить app.post_path. Это будет работать в Rails ~ = 2.3 и> = 3.1.0.

Chubas
источник
7
Просто в продолжение моего собственного комментария, кажется, это возможно с консоли rails 3, если вы используете. Во-первых, вставьте ложный запрос в объект приложения, вызвав что-то похожее, а app.get "/" затем просто instance_eval требуемые методы, так как они теперь защищены по умолчанию. Примерно так: app.instance_eval{ post_path(post) }
Чубас
Приведенный выше комментарий Чубаса работал в Rails 3. Это очень полезно при написании тестов, поэтому мне не нужно ждать 1 минуту, чтобы выяснить, что маршрут неверный. Кроме того, это здорово, чтобы проверить, получать и отправлять звонки. Вам не нужно сначала вызывать app.get.
B 7
7
app.teh_pathвсе еще работает в Rails 4.0 и полезен для отделения путей к движку от основных путей приложения.
Нуреттин
5
Если вы монтируете двигатель, например mount Spree::Core::Engine, :at => '/', тогда вы будете получать доступ к путям через имя двигателя, например app.spree_core_engine.some_path. Или, если «engine_name» настроено на что-то другое, как в этом коде, то вы бы сделали app.spree.some_path.
Джордан Броу
Мне пришлось добавить hostпараметр следующим образом:app.article_url(my_article, host: 'mydomain.com')
Besi
353

Вы также можете

include Rails.application.routes.url_helpers

изнутри консольных сессий для доступа к помощникам:

url_for controller: :users, only_path: true
users_path
# => '/users'

или

Rails.application.routes.url_helpers.users_path
aghull
источник
4
Это намного проще, чем приведенное выше решение ИМО
Андрей
2
это правильный ответ на мой первоначальный вопрос
nemesisdesign
Это должен быть лучший ответ ИМО
Лука
4
Я не могу забыть об этом, поэтому я просто возвращаюсь сюда каждые пару дней, чтобы скопировать / вставить. Спасибо.
Спенсер
1
Не могли бы вы также ссылаться на url_helpers непосредственно из консоли, как Rails.application.routes.url_helpers.users_path?
TheMadDeveloper
25

В консоли Rails переменная app содержит объект сеанса, в котором вы можете вызывать path и URL helpers как методы экземпляра.

app.users_path
user3622458
источник
11

Вы всегда можете проверить вывод path_helpersв консоли. Просто используйте помощник сapp

app.post_path(3)
#=> "/posts/3"

app.posts_path
#=> "/posts"

app.posts_url
#=> "http://www.example.com/posts"
Дипак Махакале
источник
2

Помните, если ваш маршрут разделен именами, как:

product GET  /products/:id(.:format)  spree/products#show

Тогда попробуйте:

helper.link_to("test", app.spree.product_path(Spree::Product.first), method: :get)

вывод

Spree::Product Load (0.4ms)  SELECT  "spree_products".* FROM "spree_products"  WHERE "spree_products"."deleted_at" IS NULL  ORDER BY "spree_products"."id" ASC LIMIT 1
=> "<a data-method=\"get\" href=\"/products/this-is-the-title\">test</a>" 
Аруп Ракшит
источник
1
Спасибо за spreeпример, ты ангел, упавший с небес.
Бонафернандо