Metoda destroy niedziala

Witam

Dopiero co zaczalem uczyc sie RoR’a i bawie sie razem z ksiazka Agile Web Development with Rails. Pojawil mi sie jeden problem, moge dodawac wpisy do bazy, edytowac je ale nie moge ich usuwac. Dopiero gdy recznie usune je z bazy danych znikaja z listingu. W kontrolerze wyglada to tak jak przy zwyklym scaffoldzie czyli:

def destroy
Product.find(params[:id]).destroy
redirect_to :action => ‘list’
end

Viewer list.rhtml wyglada tak:

Product Listing

<% odd_or_even = 0 for product in @products odd_or_even = 1 - odd_or_even %>
<tr valign="top" class="ListLine<%= odd_or_even %>">
    <td>
      <img width="60" height="70" src="<%= product.image_url%>"/>
    </td>
    
    <td width="60%">
        <span class="ListTitle"><%= h(product.title)%></span></ br>
        <%= h(truncate(product.description, 80)) %>
    </td>

    <td align="right">
        <%= product.date_available.strftime("%y-%m_%d") %><br />
        <strong>$<%= sprintf("%0.2f", product.price) %></strong>
    </td>

    <td class="ListActions">
      <%= link_to 'Show', :action => 'show', :id => product %><br />
      <%= link_to 'Edit', :action => 'edit', :id => product %><br />
      <%= link_to 'Destroy', {:action => 'destroy', :id => product}, :confirm => "Are you sure ?"%>        
    </td>
<%end%>

<% if @product_pages.current.previous
link_to(“Previous page”, { :page => @product_pages.current.previous})
end
%>

<% if @product_pages.current.next
link_to(“Next page”, { :page => @product_pages.current.previouss})
end
%>

<%= link_to ‘New product’, :action => ‘new’%>


Uzywam RoR’a 1.2.0. Z gory dzieki za pomoc :*

Ale pojawia się jakiś błąd, wyjątek?

nic poprostu komunikat w java tak jest ustalony “Are you sure ?” strona sie przeladowuje i nic sie nie dzieje.

Popatrz jeszcze w logi. Spróbuj także odpalić metodę “destroy” na obiekcie z konsoli railsowej.

troszeczke jasniej jak dla debila mowilem ze zaczynam ^^

Logi: plik log/development.log. Tam masz informacje o każdym żądaniu oraz zapytania SQL. Konsola: odpal ruby script/console z katalogu z projektem. To taki irb z załadowanym środowiskiem rails.

Processing AdminController#destroy (for 0:0:0:0:0:0:0:1%0 at 2008-02-13 19:53:12) [GET]
Session ID: f82864a83e16fc5d0e073f74584d11b0
Parameters: {“action”=>“destroy”, “id”=>“7”, “controller”=>“admin”}
Redirected to http://localhost:3001/admin/list
Filter chain halted as [#<ActionController::Filters::ClassMethods::ProcFilter:0x1ce70a @filter=#Proc:0x8477f3>] returned_false.
Completed in 0.01200 (83 reqs/sec) | DB: 0.00000 (0%) | 302 Found [http://localhost/admin/destroy/7]

logi wyrzucaja mi cos takiego…

Logi ładne, a przeczytałeś chociaż?:slight_smile:

Masz jakiś filtr, który zwraca wartość false, co powoduje przerwane przetwarzania aktualnego żądania. Akcja “destroy” kontrolera nie jest w ogóle odpalana. Pokaż filtry.

no to teraz zagadka pt gdzie sa filtry w netbeans IDE ^^ zaraz ogarne :slight_smile:

uuuuh nie moge znalesc tego … jakas mala podpowiedz ? :stuck_out_tongue_winking_eye:

Nie dodawałeś żadnego kodu w stylu:

before_filter :filtr #albo before_filter do end
?
To są owe filtry.

nie tez o tym czytalem na stronie internetowej, ale robie wszystko zgodnie z ksiazka … a tam nic takiego nie bylo ;/

Jaką wersję railsów zainstalowałeś? Książka opisuje wersję 1.2.x.

Może masz jakiś mechanizm logowania i tam jest coś w rodzaju access_denied?

pisalem wczesniej mam railsy 1.2.5 zadnego systemu logowania nie mam ;/

korzystam z mac os 10.4.6 jesli to cos zmieni. Robilem to samo pod winda i dzialo sie tak samo. Mysle ze to zalezy od srodowiska uzywalem do tej pory Netbeans’a, sprubuje pod TextMate i dam znac czy cos sie zmienilo :wink:

nic sie nie zmienilo, ale zobaczylem teraz cos innego w logach

Processing AdminController#destroy (for 127.0.0.1 at 2008-02-18 10:49:03) [GET]
Session ID: 5f21576169770d14730a68c8442c2b57
Parameters: {“action”=>“destroy”, “id”=>“3”, “controller”=>“admin”}
Redirected to http://localhost:3000/admin/list
Filter chain halted as [#<ActionController::Filters::ClassMethods::ProcFilter:0x25ee3e4 @filter=#Proc:0x014b8fec@/usr/local/lib/ruby/gems/1.8/gems/actionpack-1.13.0/lib/action_controller/verification.rb:74>] returned false.
Completed in 0.00163 (614 reqs/sec) | DB: 0.00000 (0%) | 302 Found [http://localhost/admin/destroy/3]

chodzi mi o to

Filter chain halted as [#<ActionController::Filters::ClassMethods::ProcFilter:0x25ee3e4 @filter=#Proc:0x014b8fec@/usr/local/lib/ruby/gems/1.8/gems/actionpack-1.13.0/lib/action_controller/verification.rb:74>] returned false.

czy tu chodzi o ten gem actionpack ?? moze go update’owac ?

Pokaż kontroler. Z tego co widzę wywołujesz destroy zwykłym GETem czego nie przepuszcza ustawienie ‘verify’ (gdzie zapewne masz ustawione że destroy możesz wywołać tylko POSTem albo utworzyłeś kontroler RESTowy).

kontoler jest zwykly taki jaki zostaje wygenerowany podczas scaffoldu.

def destroy
Product.find(params[:id]).destroy
redirect_to :action => ‘list’
end

w list viewerze wyglada to tak

<%= link_to ‘Destroy’, { :action => ‘destroy’, :id => product },
:confirm => “Are you sure?” %>

ha widzisz gdybys mi nie powiedzial o tym ze dziala tylko przy pomocy POST’u to bym nie zrobil. Poprawilem kod i dziala. Wystarczylo zmienic viewer

<%= link_to ‘Destroy’, { :action => ‘destroy’, :id => product },
:confirm => “Are you sure?”, :method => :post %>

dzieki za pomoc ;*