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

Использование Ruby on Rails link_to для ссылки на действие контроллера

Я только начал заниматься Ruby on Rails и столкнулся с проблемой со ссылкой на другое действие в контроллере с определенного вида. Я почти уверен, что это проблема (или отсутствие кода) в моем routes.rb файле, но я думаю, что я неправильно понимаю, как работает этот файл и что мне нужно делать. У меня есть решение, но я уверен, что это не лучший способ сделать это.

У меня есть один контроллер с именем home с двумя действиями, index (по умолчанию) и newbill. Внутри index.html.erb у меня есть:

<h1>Home View</h1>
<%= link_to "new", :controller => "home", :action => "newbill" %>

Однако я получал ошибку маршрутизации:

No route matches {:controller=>"home", :action=>"newbill"}

Выполнение rake routes дает мне следующее:

root  / {:controller=>"home", :action=>"index"}

Затем я (после некоторого Googling) добавил этот код к routes.rb

match 'home/newbill' => 'home#newbill', :as => :newbill

И затем в моем index.html.erb у меня есть это:

<%= link_to "Name", newbill_path %>

И теперь это работает так, как ожидалось. Мои вопросы:

  • Почему это работает? Что именно происходит за кулисами?
  • Неужели это не лучший способ сделать это? Добавление другого match 'home/newbill'... для каждого контроллера/действия, которое я хочу связать, кажется мусорным способом делать что-то.

Мне очень нравится Ruby, но немного борюсь с этим аспектом Rails... Маршрутизация вообще немного путает мне голову!

Любая помощь очень ценится: D

Спасибо,

Джек

4b9b3361

Ответ 2

Я предполагаю, что первый раз ваш код не работал, потому что ваш контроллер home определяется как ресурс.

Если вы определяете контроллер как ресурс в файле routes.rb, он будет поддерживать только 7 стандартных методов (согласно архитектуре REST) ​​

index
new
create
show
edit
update
destroy

Если вам нужны дополнительные маршруты, вы должны добавить их вручную, например, в вашем случае "newbill", может идти как

resources :home do
    collection do
      get :newbill
    end
end

Но согласно моему пониманию, ваш метод newbill должен перейти к bills контроллерам new, метод не в домашнем контроллере

Вы правы, маршруты Rails немного путаются (по крайней мере, для меня), но как только вы поймете, что можете делать много классных вещей.

Читайте здесь для документации официальных маршрутов Rails:

http://guides.rubyonrails.org/routing.html

Ответ 3

Это работает, потому что рельсы фильтруют каждый запрос через маршрутизатор в поисках соответствия. Это позволяет вам определять настраиваемые маршруты, такие как domain.com/post, когда этот путь фактически является сообщением #. До рельсов 3 маршрут маршрута был последним маршрутом в файле маршрутов. Это позволило вам определить контроллер и действие, и оно просто сработает. Я нахожусь на своем iPad и не рядом с любыми проектами, поэтому я не могу это проверить, но я думаю, что маршрут по-прежнему существует в rails 3.1, его просто нужно укомплектовать.