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 :*
seban
February 13, 2008, 5:41pm
2
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.
radarek
February 13, 2008, 5:51pm
4
Popatrz jeszcze w logi. Spróbuj także odpalić metodę “destroy” na obiekcie z konsoli railsowej.
troszeczke jasniej jak dla debila mowilem ze zaczynam ^^
radarek
February 13, 2008, 6:20pm
6
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…
radarek
February 13, 2008, 6:59pm
8
Logi ładne, a przeczytałeś chociaż?
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
uuuuh nie moge znalesc tego … jakas mala podpowiedz ?
radarek
February 13, 2008, 7:30pm
11
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 ;/
radarek
February 13, 2008, 8:49pm
13
Jaką wersję railsów zainstalowałeś? Książka opisuje wersję 1.2.x.
seban
February 13, 2008, 9:36pm
14
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
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 ?
radarek
February 18, 2008, 10:57am
18
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 ;*