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