Miltiple checkbox del

chciałem zastąpić standardowe kasowanie wpisów z “usuń” przy każdym wpisie na takie jakie zazwyczja spotyka się np, na poczcie mailowej. Czyli przy konkretnych wpisach stawiamy sobie checkboxa a na koncu wciskamy guzik formulartzowy usuń no i te zaznaczone sie kasują. W ramach testów najpierw zrobiłem wersje z kasowaniem dla jednego zaznaczonego wpisu. i działało no ale teraz chwiłbym przesjc do kilku na raz. w formularz dla konkretnego checkboxa wrzuciłem cos takiego:

<input type="checkbox" id="<%=h photo.id %>"  name="box[]" value="<%=h photo.id %>"  />

no i teraz trudna czesc czyli def destroy w controllerze. myślałem zeby moze to zrobić w taki sposob ze przelatujemy petlą for po jakiejs(?) tablicy z tymi wybranymi id do usuniecia i dla kazdego id pokolei robimy standardowe: Photo.find(params[:box]).destroy(?). Narazie poza ten pomysł nie moge wyjsc dalej :confused: (nie weim czy nie przefantazjowałem sobie z tym)

  1. Nie nadawaj samodzielnie atrybutu id elementom formularzy, railsy same to zrobią według fajnej konwencji bycia w miarę zgodnym z atrybutem name
  2. pola id nie musisz humanize’ować :wink:

Tak naprawdę można oczywiście robić name=box[], ale wtedy nie masz za bardzo kontroli nad numerami wewnątrz nawiasów kwadratowych - są one przydzielane dopiero na etapie wysłania formularza do aplikacji. Przydaje się jedna stworzona dokładnie do takich zastosowań metoda - helperowi (np. text_field czy check_box) przekazujesz parametr “index”, z wartością oczywiście równą id obiektu/wiersza.

Dokumentacja RoR, Module ActionView::Helpers::FormHelper - CAŁY wstęp przed opisem metod przeczytaj, index jest wspomniany pod koniec owego wstępu. :slight_smile:

zrobiłesm coś. Wygląda na to,że działa. Jest to tylko jedna krótka linijka kodu i jestem troche zszokowany, że to tylko tyle wiec jakby ktos mogł potwierdzić, że to wystarczy… mianowicie w kontrolerze wrzuciłem tylko tyle:

Photo.delete(params[:box])

Heh, programowanie przypadkowe?:slight_smile: Jak się nie wie to się zagląda do dokumentacji: http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M001381. Twoje params[:box] zwraca idki zaznaczonych zdjęć, metoda delete przyjmuje id lub tablicę idków obiektów do skasowania. U Ciebie działa ten drugi przypadek. Ot tyle i aż tyle.

właśnie na tej stronie znalazłem pomoc :slight_smile: tylko dalej jestem pod wrażeniem, że dało sie to załatwić taką malutką iloscia kodu :slight_smile:

Czasem da się, ale trzeba uważać. Np czy u Ciebie nie ma różnych użytkowników? Bo taką tablicę idków fotek do skasowania łatwo można spreparować i dałoby się skasować cudze fotki. Jeśli tak to musiałbyś dodać kod sprawdzający.

Np. taki:

current_user.photos.destroy(params[:box])

Zakładając, że current_user to obecnie zalogowany użytkownik i masz relację user has_many :photos
Poza tym warto pamiętać, że metoda delete nie uruchamia callback’ów przed/po usunięciem obiektu co czasami jest konieczne.