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

Как использовать Rails с именами маршрутных помощников с параметрами?

с учетом этого маршрута

match 'posts/hello/:name/:title' => 'post#show', :as => :hello
  • Каковы способы, которыми я могу позвонить hello_path?

  • если я вызываю hello_path(@post), что он пытается сделать?

Я надеялся, что файлы :name и :title будут автоматически связываться с контуром, но кажется, что рельсы знают, как получить: id из объекта модели.

вместо этого он работает, только если я назову его

<%= link_to "link2", hello_url(:name=> @post.name, :title=>@post.title) %>

(отсутствие надлежащей документации действительно убивает меня)

4b9b3361

Ответ 1

Чтобы ответить на два вопроса:

  • В командной строке запустите rake routes, чтобы узнать, какие маршруты есть в ваше приложение. Он покажет вам все способы использования названных маршрутов, просто добавьте "_path" или "_url" к названию маршрута, который показан на левый.
  • Вызов hello_path(@post) приведет к созданию URL-адреса показать страницу для этого hello экземпляра.

То, как вы его называете, является нормой:

<%= link_to "link2", hello_url(:name=> @post.name, :title=>@post.title) %>

Однако это тоже может работать:

<%= link_to "link2", hello_url(@post.name, @post.title) %>

Вот некоторая документация (отличная от Rails API), которая должна помочь. http://guides.rubyonrails.org/routing.html

Ответ 2

Чтобы ответить на ваш вопрос "что делает hello_path пытаться сделать?"

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

Затем он будет называть to_param по каждому параметру отдельно, прежде чем объединять их все вместе (см. здесь код 4.0 ветвь).

Если вы передадите объект, если он ожидает 2 или более параметров, он даже не столкнется с вызовом to_param для объекта. Это когда вы получаете ошибки без трассировки стека, которые говорят что-то вроде
No route matches {:controller=>"posts", :action=>"show", :id=>#<Post ...>}

Работа с 1 именованным параметром

Если у вас есть только один именованный параметр, все довольно просто. Если вам нужно искать сообщения по имени вместо id, вы можете просто переопределить to_param

class Post < ActiveRecord::Base
  ...
  def to_param
    name
  end
end

Работа с несколькими именованными параметрами

Но если в URL-адресе содержится более одного именованного параметра, переопределить to_param недостаточно. Скажем, вы пробовали это:

# app/models/post.rb
class Post < ActiveRecord::Base
  ...
  def to_param
    {name: name, title: title}
  end
end

# app/views/posts/index.html.erb
<%= post_path(post) %>

В этом случае вы получите ошибку маршрутизации, потому что вы не передаете достаточно аргументов для post_path (см. выше). Чтобы обойти это, я просто вызываю to_param явно:

 # app/views/posts/index.html.erb
 <%= post_path(post.to_param) %>

Это немного меньше пятна, чем большая магия маршрутизации Rails, но работает отлично. Если позже вы измените способ поиска сообщений, все, что вам нужно сделать, это переопределить to_param. Не нужно беспокоиться обо всех местах, которые вы назвали post_path

Под капотом

Соответствующий код для просмотра - actionpack/lib/action_dispatch/routing

Ответ 3

Вы также можете назвать его

hello_path(@post.name, @post.title)

Надеюсь, что это поможет.

Ответ 4

Другие ответы (на момент написания этой статьи) прекрасны, но ваш ответ на ответ GregT показывает отсутствие понимания о Rails, и это хорошо - мы все были там.

В частности, три ключевых принципа Rails: соглашение по конфигурации, архитектура модели-просмотра-контроллера (MVC) и REST. Это материал в начале каждой книги Rails. Начинающие часто думают, что они могут просто перейти к первой главе с кодом, но Rails отличается от многих других тем тем, что первые главы объясняют важные понятия и не просто вводят главу главы. Поскольку Rails не является "кодом", это "каркас кода".

"Конформация по конфигурации" означает, что если вы выполняете определенные соглашения, тогда вы получаете выгоду от поведения, испеченного в Rails. Маршрутизация является одной из тех областей, если не самой большой, где соглашение приносит пользу разработчику, хотя полностью настраивается.

Пути, следующие за определенным форматом маршрутизации, анализируются в контроллере, действии и, возможно, id, формате и дополнительных параметрах. По умолчанию и, как минимум, путь Rails (а также Sinatra) принимает следующий формат и порядок:

/controller_name/action_name

Это немного сложнее, чем с большим количеством опций, и на самом деле это выглядит в действительности:

/controller_name/action_name/(id)(.format)(?param=value)(&...)

... но это более подробно, чем это необходимо для ответа.

Контроллер - это C в MVC или класс, обрабатывающий запрос. Действие является одним из семи действий RESTful (index, show, new, create, edit, update и destroy) внутри этого контроллера. Не все действия требуют идентификатора (index, new и create), и не все из них являются get запросами (запросы, которые генерируют представление, например destroy, create и update don У меня нет просмотров.

Объединяя все это, мы видим этот пример:

/articles/edit/1

... направит запрос на действие "edit" в контроллере ArticlesController, проходящем по идентификатору 1. Он ожидал, что контроллер выполнит некоторую домашнюю работу, например проверку подлинности и авторизацию, затем извлечет модель статьи (M CV) с идентификатором 1 и передать его в режим редактирования (MC V).

Лучше всего, особенно для новых разработчиков Rails, придерживаться этих соглашений и, возможно, добавить несколько дополнительных действий, кроме тех, которые предоставляются REST.

Вы можете выйти за пределы этого соглашения, настроив в файле routes.rb альтернативную схему маршрутизации, не следуя REST и т.д., но вы будете похожи на лосось, плавающий вверх по течению - это намного сложнее, чем движение с потоком, Если вы спуститесь по этому пути (каламбур), вы сделаете большую дополнительную работу для себя, возможно, немного изобретете колесо и потеряете преимущества, предоставляемые инфраструктурой Rails. Если вы обнаружите, что в этой ситуации по какой-либо причине, возможно, Rails не является подходящим инструментом для вашей работы.