Hej, witam wszystkich.
Jestem nowy w Ruby on Rails i projektuję aplikację reserwującą bilety autobusowe. Póki co jestem na początku mojej drogi. Robię ją na bazie aplikacji z książki Ruby on Rails 3 Tutorial learn Rails by example Michael Hartl. Skończyłem czytać całą książkę ale nadal nie jestem do końca w stanie usystematyzować sobie wiedzy zdobytej w książce. Moja aplikacja znajduje się tutaj : http://github.com/coolphon/BusCompanySupport
Mam problem ze stworzeniem akcji reserwacji biletu. Tak to wygląda z mojej strony :
Routes.rb :
…
resources :tickets do
‘reserve’
end
…
index ticketów zawiera taki wpis jako rezerwowanie biletu:
…
<%= link_to ‘Reserve’, ticket, :confirm => ‘Are you sure, u want to reserve this ticket?’, :method => :reserve %>
…
I teraz, moje pytanie brzmi czy kiedy wywołuję w ten sposób metodę reserve to powinna ona wywołać metodę z kontrolera ticketów ? Kiedy klikam w link railsy mi wyrzucają komunikat : No route matches “/tickets/2” czyli coś z plikiem routingu pewnie skopałem tylko nie bardzo wiem co.
Dzięki za tak szybką odpowiedź. Próbowałem właśnie wcześniej szczęścia z różnymi kombinacjami member w routingu. Teraz ustawiłem to w ten sposób :
resources :tickets do
member do
put ‘reserve’
end
end
do kontrolera ticketów dorzuciłem save tak jak poradziłeś. Po wykonaniu bundle exec rake routes mam ścieżkę : reserve_ticket PUT /tickets/:id/reserve(.:format) {:action=>“reserve”, :controller=>“tickets”}
Pomimo tego nadal dostaję komunikat : No route matches “/tickets/2”
Widok indexu tez zaktualizowałem :
<%= link_to 'Reserve', reserve_ticket_path(ticket), :confirm => 'Are you sure, u want to reserve this ticket?', :method => :reserve %>
EDIT : A co do PUT to wnioskuję że właśnie tą akcję powinienem użyć bo działam na stworzonym tickecie ktorego chce zupdatowac(czyli zarezerwowac)
EDIT2: Wstawiłem POST zamiast PUT i pomoglo(warto czytac komunikaty jakie sa w terminalu serwera)
Zmieniłem na put i mam po kliknięciu na link : Started GET “/tickets/8/reserve” for 127.0.0.1 at 2011-10-22 15:19:07 +0200
ActionController::RoutingError (No route matches “/tickets/8/reserve”):
Też mi się wydawało że to powinien być put ale request przez przeglądarke po wciśnięciu linka to get… i oczywiście wstawiłem w linku method => :put ale nie pomaga…
Mianowicie kolega Max Williams zwraca uwagę że linkowanie za pomocą method innych niż get jest raczej bezsensu i lepiej stosować button_to. Załatwia się dzięki temu 2 pieczenie na jednym ogniu. Primo : rozdziela działania od linkowania (linki są do przenoszenia na strony a buttony są do wykonywania działań) Secundo : można buttonami przesyłać wszystkie metody typu put, post itd. Zmieniłem na button i śmiga.
Czyli w routes jest put , a w widoku mam buttona zamiast linka i tak pozmieniam sobie formularze gdzie jest jakaś funkcjonalność z linków na buttony.