Hidden field, wysyłanie id, sesje

Yo,

Zakładając, że dodaję notatkę/opis do ekranu, potrzebuję wysłać do kontrolera konkretne id tego ekranu, robienie tego poprzez ukryte pole to chyba patologia. Zrobiłem to poprzez sesję:

[code]Widok:
<% session[:led_id] = @led.id %>

Kontroler:
@note = Note.new(params[:note])
@note.led_id = session[:led_id]

  if @note.save
  	session[:led_id] = nil[/code]

Czy takie coś jest OK, czy są bezpieczniejsze/lepsze/szybsze metody?

Pozdrawiam serdecznie. :slight_smile:

W akcji “new” ustaw led_id dla @note na odpowiednia wartość, a w formularzu dodaj pole ukryte. Przekazywanie tego przez sesję nie jest sensowne.

Hmm, ale taką wartość z pola input można przecież edytować. Nie zagraża to bezpieczeństwu?

Nie, bo powinieneś w akcji create w kontrolerze upewnić się, że użytkownik może utworzyć dany obiekt.

Chyba nie do końca rozumiem.

Zrobiłem tak jak mówicie, czyli:

[code]Kontroler LEDS, tutaj tworzę obiekt:

def show
led = Led.find(params[:id])
@notes = led.notes
@note = Note.new
@note.led_id = led.id

respond_to do |format|
  format.html # show.html.erb
  #format.xml  { render :xml => @led }
end

end[/code]

[code]Widok, tutaj przejmuję id:

<%= f.hidden_field :led_id, :value => @note.led_id %>[/code]

[code]Kontroler NOTES, tutaj zapisuję notkę.

def create

respond_to do |format|
  if @note.save
end

end[/code]
Wszystko działa prawidłowo, oprócz bezpieczeństwa, bo mogę zmienić ID ekranu w polu hidden. Co robię źle?

Jak wyżej pisze musisz zadbać o to czy dana osoba ma możliwość utworzyć notkę dla innego id, jak tak to niech zmienia kto jej broni. Możliwość bardzo podobna, bez hidden_field to url zagnieżdzony.

Ma to swoje minusy, ale się da. np /posts/32/comment, wtedy stosowne ID masz z linka. Obsługa w sumie ta sama co hidden field inny zapis.