Dziwne działanie link_to i akcji destroy

routes.rb

namespace :admin do resources :blocks, :except => [:show] end

admin_blocks GET /admin/blocks(.:format) {:action=>"index", :controller=>"admin/blocks"} POST /admin/blocks(.:format) {:action=>"create", :controller=>"admin/blocks"} new_admin_block GET /admin/blocks/new(.:format) {:action=>"new", :controller=>"admin/blocks"} edit_admin_block GET /admin/blocks/:id/edit(.:format) {:action=>"edit", :controller=>"admin/blocks"} admin_block PUT /admin/blocks/:id(.:format) {:action=>"update", :controller=>"admin/blocks"} DELETE /admin/blocks/:id(.:format) {:action=>"destroy", :controller=>"admin/blocks"}
widok:

= link_to(image_tag("icons/remove.png", :title => "Usuń", :alt => "Usuń"), admin_block_path(block), :method => :delete)
  1. Dziwne jest że przy DELETE nie wypisuje mi skróconej ścieżki, bo wg guida: http://guides.rubyonrails.org/routing.html ścieżka powinna być wyświetlona.

  2. Teraz to działa tak, że ten widok normalnie się wyświetla, ale jak klikne w link, to pojawia się strona że nie ma takiego routingu.

  1. Nie rozumiem. Gdzie nie wyświetla ci skróconej(?) ścieżki?
  2. Pokaż jakiś większy kawałek kodu. Bez kontrolera, większego kawałka widoku itd. to nic się nie uda pomóc :slight_smile:

btw. pomyśl nad przeniesieniem obrazka do css-ów

[code=ruby]= link_to t(’.remove’), [:admin, block], method: :delete, class: :remove_icon

Nie jestem pewien czy [:admin, block] zadziała, w razie czego zmień na admin_block_path(block)[/code]

.remove_icon { text-indent: -9999px background: url('icons/remove.png') no-repeat; }
Kod widoku jest czytelniejszy, a i łatwiej zmienić wygląd strony :slight_smile:

  1. w ostatniej akcji nie wyświetla skróconej ścieżki (czyli …_path) tam gdzie jest metoda DELETE
  2. to jest cały kod, no moża poza tym, że w kontrolerze mam wpisane
@blocks = Block.all()

a w widoku

@blocks.each do |block| = link_to(image_tag("icons/remove.png", :title => "Usuń", :alt => "Usuń"), admin_block_path(block), :method => :delete) end
Tą zmianę w kodzie co zaproponowałemś (z tym nawiasem, to działa ona tak samo jak admin_block_path(block), czyli nie znajduje routingu po kliknięciu)

Jeśli chodzi o przeniesieniu tego do css to masz zupełną rację, ale tym się zajmę zachwilę, narazie chcę zmusić do działania ten link.

  1. To akurat normalne zachowanie.
  2. W sensie, że błąd 404? URL po kliknięciu w link wygląda tak jak powinien (tak jak wyświetla go w terminalu rake routes)?

btw. restartowałeś serwer? :smiley:

  1. nie wiem czy normalne bo w guide podają coś innego niż mi się wyświetla, ale ok przyjmijmy że jest prawidłowo
  2. Wyświetla się:

Routing Error No route matches "/admin/blocks/1"
Zrestartowałem serwer (domyślny serwer railsów) ale to nie pomogło.

Mówiąc szczerze nie mam pomysłu dlaczego tak się dzieje. Jedyne co mi przychodzi do głowy (zabrzmi to idiotycznie, wiem :D) - mam podobny problem z linkiem do wylogowanie w Devise. Czasem jak coś wariuje z tym linkiem wywalam method: :delete, kilka razy klikam w ten link (oczywiście wyrzuce No route matches [GET] (...)), potem dodaję znowu method: :delete i z jakiegoś nieznanego mi powodu znowu działa.

Jest to jakaś ciężka magia, której jeszcze nie udało mi się pojąć :smiley:

Javascripty są na swoim miejscu? Bo generalnie :method => :delete w linku działa przy pomocy javascriptu, tzn. zamieniane jest to afair na formularz z hidden fieldem.

Która wersja railsów?

Dzisiaj wieczorem sprawdzę wskazówkę od @gajowy, co trochę mnie zmartwiło bo staram się teraz zrobić stronę unobtrusive javascript. Więc chyba będę musiał zastosować jakieś alternatywne rozwiązanie.

Rails 3.0.9

Ale jaki jest problem? :smiley: Przecież w Rails3 method, confirm i inne helpery, które wcześniej ładowały javascript prosto do html-a teraz są napisane unobtrusive :slight_smile:

nie wiem w jaki sposób railsy mogą zamieniać ten link_to z method delete na formularz bo u mnie to nie działa, ale znalazłem inna alternatywe

<style> .delete_button { background: ... border: 0px; } </style> <%= button_to "", admin_block_path(1), {:confirm => "Are you sure?", :method => :delete, :class => "delete_button" } %>
Jest to prawie tak samo krótkie jak link_to.

I button_to działa? Niemożliwe, żeby button działał a link nie. :rolleyes:

Spróbuj może jeszcze link_to ale z confirm - do button_to dałeś confirm, do link_to nie.

Możliwe, też tak zmieniałem ostatnio na button_to.
Ale spróbuj zrobić tak:
link_to, ale zamiast :method => :delete, to daj :method => ‘delete’ : )

[quote]I button_to działa? Niemożliwe, żeby button działał a link nie. roll

Spróbuj może jeszcze link_to ale z confirm - do button_to dałeś confirm, do link_to nie.[/quote]
Cośtam jest z tymi metodami, więc nieraz kiedy metoda jest delete/put to link_to baranieje, ale button_to działa. Nie chcę się w to zgłębiać, ale w rails 3.1.0.rc5 już nie spotkałem się z tym problemem : )

@wafcio: Jquery czy prototype? I tak jak mówił @zlw - railsy używają unobtrusive, ale musi być js, który to obsłuży.

w tym projekcie akurat jquery

https://github.com/rails/jquery-ujs poprawnie zainstalowane?

Nie no, tak to możemy do usranej śmierci :smiley:

Pokaż Gemfile, layout, kontroler, widoki, fragment tego co generuje przeglądarka (js-y się poprawnie wczytały?), logi … cokolwiek :smiley:

Załatwiłem to poprzez button_to, a javascript do generowania linku lub formularza nie ma nic do rzeczy, tutaj jest jakiś problem z railsami. Ponieważ sprawę już załatwiłem (jak pisałem pare postów wyżej) to nie musicie już drążyć tematu.

Ech, ten temat mi przypomniał najnowsze doniesienie z frontu Internet Exporer 9 kontra reszta świata. Uważajcie na redirecty po kasowaniu!
http://techno-weenie.net/2011/8/19/ie9-deletes-stuff/