Ответ 1
Вы должны проверить Руководство по маршрутизации Rails. Чтение поможет вам понять, что происходит за кулисами.
Я только начал заниматься 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
Спасибо,
Джек
Вы должны проверить Руководство по маршрутизации Rails. Чтение поможет вам понять, что происходит за кулисами.
Я предполагаю, что первый раз ваш код не работал, потому что ваш контроллер 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:
Это работает, потому что рельсы фильтруют каждый запрос через маршрутизатор в поисках соответствия. Это позволяет вам определять настраиваемые маршруты, такие как domain.com/post, когда этот путь фактически является сообщением #. До рельсов 3 маршрут маршрута был последним маршрутом в файле маршрутов. Это позволило вам определить контроллер и действие, и оно просто сработает. Я нахожусь на своем iPad и не рядом с любыми проектами, поэтому я не могу это проверить, но я думаю, что маршрут по-прежнему существует в rails 3.1, его просто нужно укомплектовать.