Использование Ruby on Rails link_to для ссылки на действие контроллера - PullRequest
12 голосов
/ 19 ноября 2011

Я только начал играть с 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"}

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

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

А потом в моем index.html.erb я получил это:

<%= link_to "Name", newbill_path %>

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

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

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

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

Спасибо,

Джек

Ответы [ 3 ]

8 голосов
/ 19 ноября 2011

Я думаю, в первый раз ваш код не работал, потому что ваш контроллер 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, метод не вhome controller.

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

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

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

7 голосов
/ 19 ноября 2011

Вам следует ознакомиться с Руководством по прокладке рельсов .Прочтение поможет вам понять, что происходит за кулисами.

0 голосов
/ 19 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...