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:
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.
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
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
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 Dzięki za odpowiedzi i do następnego!