Tip: multi-select-Helpers 0

Posted by fwoeck
on Saturday, November 01

Hier sind mehrere Anforderungen zusammen zu erfüllen:

  1. im Formular soll eine Mehrfachselektion möglich sein
  2. die Zuweisung der Auswahl soll mit mass-Assignment an ein Proxymodell erfolgen (hier User und Roll)
  3. falls ein neuer User angelegt wird, soll die Auswahl leer sein
  4. falls ein bestehender User editiert wird, soll die Auswahl seinen aktuellen Status wiedergeben
<%= select_tag 'user[roll_ids][]', options_for_select(Roll.all_cached.map 
      {|w| [w.name, w.id]}, @user.rolls.map(&:id)), :multiple => true %></p>

mass-assignment für Proxies 0

Posted by fwoeck
on Saturday, November 01

Wie kann ich die Struktur eines Feld-Helfers so anpassen, dass die Daten eines Formulars direkt via mass-assignment an ein relationales Modell übergeben werden?

Wir haben ein Modell User und ein Modell Roll, wobei ein User auf dem üblichen Weg mehrere Rollen haben kann.

Rails bietet für diese Fälle die Methode modellname_ids an, die im Helper dann mit einem [] versehen wird, um ggf. mehrere Werte als Array zu übertragen:

<%= select_tag 'user[roll_ids][]', options_for_select(Roll.all.map 
      {|w| [w.name, w.id]} ) %></p>

Und so in der Konsole:

>> u = User.find(2)
=> #<User id: 2, login: "me", email: "me@bm.net", ..., name: "Thats Me">

>> u.rolls
=> [#<Roll id: 5, name: "Sys-Serv", ...>]

>> u.roll_ids = [1,5]
=> [1, 5]

>> u.rolls
=> [#<Roll id: 5, name: "Sys-Serv", ..., #<Roll id: 1, name: "Admins", ...>]