Metoda "aktywuj"

Witam, rozpocząłem swoją historię z railsami wczoraj i mam kolejny problem. W ramach ćwiczeń piszę “aplikację” do wstawiania filmików. Kolejne filmiki dodawane są standardowo jako nieaktywne (pole w bazie active = 0). Do kontrolera Video dopisałem sobie coś takiego:

[code] def aktywuj
@video = Video.new(params[:video])
@video.active = 1;

respond_to do |format|
  if @video.update_attributes(params[:video])
    flash[:notice] = 'Filmik został aktywowany.'
    format.html { redirect_to(@video) }
    format.xml  { head :ok }
  else
    format.html { render :action => "edit" }
    format.xml  { render :xml => @video.errors, :status => :unprocessable_entity }
  end
end

end[/code]
A w widoczku mam link do aktywacji: <%= link_to 'Aktywuj', video, :confirm => 'Jesteś pewien?', :method => :aktywuj %>
Po kliknięciu ukazuje się błąd 500 Internal Server Error. Starałem się wzorować na metodach standardowo dodanych przez scaffold, ale coś pokręciłem.

Odpalaj aplikację w trybie development (a nie production) i pokaż stack trace.

Jestem w trybie dev, gdyż logi test i production są puste. Miałem błąd w linku gdyż nie mogłem napisać: :method => :aktywuj.

Zmieniłem trochę metodę aktywuj w kontrolerze Video:

def aktywuj @video = Video.find(params[:id]) @video.active = 1; respond_to do |format| if @video.update_attributes(params[:video]) flash[:notice] = 'Filmik jest aktywny.' format.html { redirect_to(@video) } format.xml { head :ok } else format.html { render :action => "edit" } format.xml { render :xml => @video.errors, :status => :unprocessable_entity } end end end
Jak wpiszę w przeglądarce http://localhost:3000/videos/aktywuj/id_filmiku to wszystko działa jak trzeba. Chcę jednak to zrobić metodą POST, a nie GET
Dałem link w widoku: <%= link_to ‘Aktywuj’, video, :action => ‘aktywuj’, :confirm => ‘Jesteś pewien?’, :method => :post %>

Dostaje błąd:
Unknown action
No action responded to 2. Actions: aktywuj, create, destroy, edit, index, new, show, and update

Musisz sobie routa ustawić dobrze zapewne.

daj rake routes i zobacz jak masz.

Raczej nie o to chodziło. Poradziłem sobie w taki sposób, że użyłem button_to zamiast link_to a wywołanie metody “zabezpieczyłem” po przez if request.post?

[quote=Chmarus]Raczej nie o to chodziło. Poradziłem sobie w taki sposób, że użyłem button_to zamiast link_to a wywołanie metody “zabezpieczyłem” po przez if request.post?
[/quote]
Właśnie o to chodzi… masz źle (albo wcale) ustawione routes dla tej akcji

... map.resources :videos, :member => { :aktywuj => :post } ...
button_to, link_to tu nic nie zmienia, a rozwiązanie if request.post?.. nie tędy droga
a w :method nie umieszcza się akcji tylko rodzaj żądania http ( :get, :post, :put, :delete )

W pliku routes nic nie ustawiałem, a wszystko teraz działa. Dlatego napisałem, że raczej nie to było na rzeczy. Problem tkwił w widoku, gdyż po kliknięciu w link Aktywuj otrzymywałem wyżej wspomniany błąd. Natomiast jak wpisałem adres w przeglądarce http://localhost:3000/videos/aktywuj/id_filmiku to wszystko działało jak trzeba

Nie chcesz zrozumieć ;] Ale spoko. Mądrość przychodzi z czasem.

Działa, bo na końcu w routes.rb masz zapewne dwie reguły, które kreują/dopasowują wszystkie adresy w formie kontroler/akcja i kontroler/akcja/id do… odpowiednich kontrolerów i akcji. Ale to działa tylko dla GET, dla POST musisz explicite napisać regułę, tak jak mówi rajah tudzież gotar.

Masz rację, nikt się nie urodził z doskonałą znajomością railsów. Teraz już wiem o co Wam chodziło, post katafrakt’a przemówił mi do rozsądku :wink: Dzięki za odpowiedzi i do następnego!