Tworzenie nowej akcji

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

tickets_controller.rb:

def reserve
@ticket = Ticket.find(params[:id])
@ticket.user_reserved_id = current_user.id
redirect_to(index)
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.

Tak na początek to to:

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

Najważniejsze dla ciebie to kawałek o member, pkt 2.9!!

no i przydał by się jeszcze save w tej akcji reserve, bo chyba chcesz by to przypisanie było trwałe?

def reserve
@ticket = Ticket.find(params[:id])
@ticket.user_reserved_id = current_user.id
@ticket.save
redirect_to(index)
end


A no i sprawdź sobie jakie sciezki masz w ogole dostepne!

w konsoli: bundle exec rake routes

powinienes miec cos takiego jak juz dorze do zrobisz

reserve_ticket_path ktora przyjmuje id, czyli w akcji dajesz link_to ‘Reserve’, reserve_ticket_path(ticket) i tyle

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)

to tak na koniec w link_to masz za dużo rzeczy, wystarczy

= link_to ‘Reserve’, reserve_ticket_path(ticket), :confirm => ‘Are you sure, u want to reserve this ticket?’

to z method jest niepotrzebne tam

Wywaliłem method i zmieniłem ponownie w routes post ‘reserve’ na get ‘reserve’ i działa. Dzięki.

wowowowowowo nie! jeszcze raz :slight_smile:

Akcja zmienia rekord, więc to nie może być POST, a już na pewno nie GET.

do routes.rb dodaj:

resources :tickets do put 'reserve', on: :member end
i link_to:

link_to 'Rezerwuj', reserve_ticket_path(ticket), confirm: 'Are You sure?', method: :put

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…

EDIT : Tutaj znalazłem ciekawy głos : http://railsforum.com/viewtopic.php?id=38460

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.

napewno zmieniłeś w link_to na method: :put? Bo wygląda jakby nie załapało, że chcesz to wywołać PUT-em i wywołuje GET-em.

Spróbuj jeszcze zmienić link_to na button_to. Czasem są problemy z method dodanym to link_to