Problem mit update_attributes


#1

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 :confused:
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


#2

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


#3

Jonathan W. schrieb:

Das Internet hab ich jetzt durchwühlt ohne Ergebnis. Wo liegt mein
params[:chat]



rubyonrails-ug mailing list
removed_email_address@domain.invalid
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