Hier kleinere Rails-Codeschnipsel, die ich in letzter Zeit benutzt habe.
Form-Partial in Rails 2.0
Als ich mir den Scaffold für die einzelnen Artikel erstellt habe, wurde mir kein Form-Partial (_form.html.erb) erstellt, wie ich es aus Rails 1.2.3 kannte (dort hieß die Datei noch _form.rhtml). So stand der Code der Eingabe- und Editierform 2x im Code: einmal in new.html.erb und einmal in edit.html.erb.
Vorher fand' ich das irgendwie besser, da die Form für's Editieren und neu Hinzufügen die gleiche ist, und somit habe ich den alten Zustand wieder hergestellt.
Zuerst musste ich die Datei _form.html.erb erstellen. Dort kam dann der ganze Code der Form rein, bis auf den Button zum abschicken der Form.
Da in Rails 2.0 der form_for tag etwas anders aussieht...
<% form_for(@article) do |f| %>
...und die Abkürzung über die Variable f gegangen wird...
<%= f.text_field :title, :class => "text_field" %>
musste eben diese noch übergeben werden. Dies geschieht mit folgendem Zusatz im render-Aufruf des Partials:
<%= render :partial => "form", :locals => {:f => f} %>
Und so ist dann auch wieder alles ordentlich DRY.
Tabindex
Um einen Tabindex für Eingabefelder festzulegen, gibt es einfach die Option :tabindex
<%= f.text_field :title, :class => "text_field", :tabindex => "1" %>
Focus auf ein bestimmtes Feld setzen
Dazu legt man sich lediglich eine kleine Helper-Funktion z.B. in application_helper.rb an...
def set_focus_to_id(id)
javascript_tag("$('#{id}').focus()")
end
...und ruft diese - nach dem end-tag der Form - wie folgt auf:
<%= set_focus_to_id "article_title" %>
Das ganze setzt voraus, dass die Prototype/Scriptaculous-Skripte eingebunden sind über
<%= javascript_include_tag :defaults %>
(via Wolfmans Howlings)
validates_presence_of mit habtm korrekt in update-Action
Hat man eine many-to-many Beziehung zwischen zwei Entitäten, wie sie z.B. habe mir Artikel und deren Kategorien...
has_and_belongs_to_many :categories # (in article.rb)
has_and_belongs_to_many :articles # (in category.rb)
...so gab es bei der Update-Aktion im articles-controller das Problem, dass die Zeile
validates_presence_of :categories # (in article.rb)
keine Wirkung zeigte und Änderungen an den Kategorien (in meinem Fall mit Checkboxen dargestellt) nicht übernommen wurden. So musste noch folgende Zeile in der Aktion update in articles_controller.rb hinzugefügt werden:
@article.categories.clear if !params['article']['category_ids']
In der Form sieht das Ganze wie folgt aus:
<% for category in @categories %>
<%= check_box_tag "article[category_ids][]", category.id,
@article.categories.include?(category), :class => "checkbox" %>
<%= " " + category.long_name %><br/>
<% count = count + 1 %>
<% end %>
(via diverser Quellen, die ich nicht mehr zusammen bekomme ;-))
(Randnotiz: wenn ich mir so besonders meine letzte Überschrift in diesem Post so durchlese, frage ich mich manchmal, warum man sich es antut Posts auf deutsch zu schreiben!? Da ich grundsätzlich in Englisch programmiere, und mir eigentlich auch englische Code-Kommentare leichter von der Hand gehen, muss ich manchmal echt überlegen, wie ich das, was ich schreiben möchte, jetzt auf deutsch ausdrücke.)
Comments (3)
Dann schreib englisch - das ist grundsätzlich sowohl für Blog als auch für Diplom- bzw. Masterarbeiten aus meiner Sicht nicht nur OK, sondern eigentlich sogar bevorzugt.
Posted by Stefan Tilkov | 05.11.07 21:48
Posted on 05.11.07 21:48
Die Anmerkungen zu den Partials, besser gesagt dieses Stück :locals => {:f => f} hat mir gerade weitergeholfen, besten Dank!
Posted by Tim | 23.11.07 20:17
Posted on 23.11.07 20:17
Freut mich geholfen zu haben!
Posted by Daniel | 23.11.07 20:30
Posted on 23.11.07 20:30