Hi,
ich stelle gerade meine kleine Anwendung auf Rails 2.1.0 um (vorher
Rails 1.2.3). Jetzt stolper ich über eine alltägliche Situation -
update_attributes.
Mein Modell “User” hat u.a. ein Feld “Bemerkung”, welches ich erst im
Controller mit:
params[:user][:bemerkung] = @user.bemerkung << "bearbeitet am " <<
Time.now << params[:chat]
bearbeite.
Edit-View:
<% form_for(@user) do |u| %>
…
Bemerkung |
<%= simple_format(@user.bemerkung) %> |
<%= text_area_tag 'chat', nil, :size => "75x10"
%> |
...
<%= u.submit "Speichern" %>
<% end %>
Controller-Update
def update
@user = User.find(params[:id])
params[:user][:bemerkung] = @user.bemerkung << "bearbeitet am " <<
Time.now << params[:chat]
if @user.update_attributes(params[:user])
flash[:notice] = ‘User erfolgreich gespeichert.’
…
end
end
Bisher lief das alles prima, mit update_attributes wurde auch das Feld
“Bemerkung” geupdatet.
Seit der Umstellung geht dies nicht mehr, er speichert alle veränderten
Felder, nur die Bermerkung nicht mehr
Ich habe inzwischen auch mal ein hidden_field ausprobiert, da speichert
ers zwar in die DB (MySql), jedoch müllt er mir damit die Bemerkung bei
jeder fehlerhaften Validierung zu.
Bemerkung hat aber keine Validierung anmerk
Das Internet hab ich jetzt durchwühlt ohne Ergebnis. Wo liegt mein
Denkfehler?
Grüsse
Dani
Das Internet hab ich jetzt durchwühlt ohne Ergebnis. Wo liegt mein
Denkfehler?
update_attributes gehört meiner meinung nach Verboten, da es nur zu
schlechtem Code führt. Ich glaube dein Problem ist, dass params
nicht mehr schreibbar ist, sondern ein reiner getter geworden ist.
Probier mal
@user.attributes = params[:user]
@user.bemerkung = @user.bemerkung << "bearbeitet am " << Time.now <<
params[:chat]
if @user.save
…
end
Wobei die @user.bemerkung
-Zeile auch eher in das Model gehört, z.B.
in einen Callback.
Jonathan
Jonathan W. schrieb:
Das Internet hab ich jetzt durchwühlt ohne Ergebnis. Wo liegt mein
params[:chat]
rubyonrails-ug mailing list
[email protected]
http://mailman.headflash.com/mailman/listinfo/rubyonrails-ug
Zunächst vielen Dank erstmal.
Habe das ganze mal mit @user.save probiert und leider komme ich zum
gleichen Ergebnis.
Jetzt habe ich das Ganze mal auseinander genommen:
1.
params[:user][:bemerkung] = "bearbeitet am " << Time.now <<
params[:chat]
2.
params[:user][:bemerkung] = @user.bemerkung << "bearbeitet am " <<
Time.now << params[:chat]
3.
params[:user][:bemerkung] = @user.bemerkung
Punkt 1 führt er korrekt aus, mit Eintrag in DB
Punkt 2 ist ohne Eintrag in DB
Punkt 3 ist zwar hirnrissig (aber gut zum Testen), ebenfalls ohne
Eintrag in DB, hier liegt also mein Problem
Lasse ich mir vorher @user.bemerkung mittels puts ausgeben, ist der alte
Wert von Bemerkung korrekt drin.
Jetzt verstehe ich gar nichts mehr:/ Wieso überträgt er den alten Wert
nicht, aber alles andere?
Und warum ist save besser als update_attributes?
Grüsse
Dani