Vorstellung

Hallo Mailinglist,
Wollte mich hier mal vorstellen und euch gleich mal mit einem Problem
konfrontieren.

Zu mir: Ich bin 22 und komme aus Wien. Bin eher zufällig auf RoR
gekommen da ich eine Applikation von jemand anderen finalisieren muss.
Beschäftige mich nun seit ca einem halben Jahr damit. Doch ich muss
immer wieder feststellen, dass ich noch immer massive
Verständnisprobleme habe und extreme Anfängerfehler mache.

Zu meinem Problem:
Ich lade mir im Controller einen Datensatz in eine instanzvariable
(@object als beispiel)

im view habe ich dann ein remote_form:

<% remote_form_for(:object, :condition => “wizard.validate()”, :url =>
url_for({ :action => “update”, :activation_hash =>
@activation_hash}), :html => {:id => “wizard_form”}) do |f| %>

<%= f.label :birthdate, "Geburtsdatum" %>
<%= f.date_select :birthdate, :start_year => DateTime.now.year, :end_year => 1930, :use_month_numbers => true %>

....

<%= f.label :existing_damage, "Haben sich Schäden ereignet, die noch nicht einer Versicherung gemeldet wurden?" %>
<%= f.select :existing_damage, ["Ja", "Nein"], {:id => "object_existing_damage", :class => "validate-selection"} %>

  </p>

<%= f.submit "Ändern" %>

sämtliche text_fields und text_areas werden ja korrekt mit den daten des
datensatzes vorbelegt. die sleect und dateselects jedenfalls haben als
vorbelegung den ersten listeneintrag.

ich hoffe ich hab mich klar und verständlich ausgedrückt und das ihr mir
helfen könnt.

Hallo Unbekannter (Stefan?),
die Mailingliste hilft Dir gerne weiter, wenn Du eine konkrete Frage
formulierst.

Viele Grüße
Nicolai

Servus Stefan,

unter irc.freenode.net#rubystammtisch ist unsere Wiener Clique zu
finden.

Am 19.05.2009 um 23:07 schrieb Stefan Feigl:

<% remote_form_for(:object, :condition => “wizard.validate()”, :url =>
url_for({ :action => “update”, :activation_hash =>
@activation_hash}), :html => {:id => “wizard_form”}) do |f| %>

Jetzt fang ich mal zum philosphieren an…
Also, besser alles geht auch ohne JS noch super, daher
lieber ein form_for und das JS kannst du dann in feinster
obstrusive-JS Manier einfach dranbinden.
Ich hätte eine Fünf-Zeilen-Lösung für JQuery, aber prototype
sollte da ned komplizierter sein.

   <%= f.label :birthdate, "Geburtsdatum" %><br />
   <%= f.date_select :birthdate, :start_year =>

DateTime.now.year, :end_year => 1930, :use_month_numbers => true %>

Ich kann da jetzt nix falsches feststellen, ganz sicher dass ein
Wert drin ist? Zum testen mal ein text_field

   <%= f.label :existing_damage, "Haben sich Schäden ereignet, die

noch nicht einer Versicherung gemeldet wurden?" %>

<%= f.select :existing_damage, [“Ja”, “Nein”], {:id =>
“object_existing_damage”, :class => “validate-selection”} %>

API sagt:
select(object, method, choices, options = {}, html_options = {})
also bei dir dann:
f.select :existing_damage, [“Ja”, “Nein”], {}, {:id =>
“object_existing_damage”, :class => “validate-selection”}

sämtliche text_fields und text_areas werden ja korrekt mit den daten
des
datensatzes vorbelegt. die sleect und dateselects jedenfalls haben als
vorbelegung den ersten listeneintrag.

ich hoffe ich hab mich klar und verständlich ausgedrückt und das ihr
mir
helfen könnt.

Hätt besser sein können, aber ich bin ja noch wach :slight_smile:

ciao, tom


Thomas R. “TomK32” Koll || http://tomk32.de || http://ananasblau.com
just a geek trying to change the world
Skype: TomK32 || Mail: [email protected]
About Thomas R. Koll | Flickr

Am 20.05.2009 um 00:01 schrieb Codeblogger:

die Mailingliste hilft Dir gerne weiter, wenn Du eine konkrete Frage
formulierst.

hehe, bin ich doch der einzige der wach genug ist :wink:

Das hier war seine Fehlerbeschreibung:
“die sleect und dateselects jedenfalls haben als vorbelegung den
ersten listeneintrag.”

'nacht, tom


Thomas R. “TomK32” Koll || http://tomk32.de || http://ananasblau.com
just a geek trying to change the world
Skype: TomK32 || Mail: [email protected]
About Thomas R. Koll | Flickr

Habe es nun hinbekommen, dass er die richtige Vorbelegung findet.
Habe in den select tags statt :existing_damga “existing_damage”
geschrieben und jetzt übernimmt er die richtigen werte.

jedoch sendet er das form nach einer fehlerhaften validierung immer noch
nicht ab.
und im server log sehe ich, dass er bei update_attributes ein nil object
bekommt. hier der controller code:

def update
@object = Object.find(:first, :conditions => [“activation_hash = ?”,
params[:activation_hash]])
@new_activation_hash = //neuer Hash wird generiert
unless params[:object].nil?
if @object.update_attributes(params[:object])
if @object.update_attribute(:activation_hash,
@new_activation_hash)
ServiceMail.deliver_confirmation({:object => @object})
end
end
end
end

und der error:

NoMethodError (You have a nil object when you didn’t expect it!
You might have expected an instance of ActiveRecord::Base.
The error occurred while evaluating nil.update_attributes):
app/controllers/confirmation_controller.rb:40:in update' /usr/lib/ruby/1.8/webrick/httpserver.rb:104:in service’
/usr/lib/ruby/1.8/webrick/httpserver.rb:65:in run' /usr/lib/ruby/1.8/webrick/server.rb:173:in start_thread’
/usr/lib/ruby/1.8/webrick/server.rb:162:in start' /usr/lib/ruby/1.8/webrick/server.rb:162:in start_thread’
/usr/lib/ruby/1.8/webrick/server.rb:95:in start' /usr/lib/ruby/1.8/webrick/server.rb:92:in each’
/usr/lib/ruby/1.8/webrick/server.rb:92:in start' /usr/lib/ruby/1.8/webrick/server.rb:23:in start’
/usr/lib/ruby/1.8/webrick/server.rb:82:in `start’

Rendered rescues/_trace (34.1ms)
Rendered rescues/_request_and_response (0.7ms)
Rendering rescues/layout (internal_server_error)

grundsätzlich überprüfe ich ja mit der unless abfrage, dass das object
nicht nil ist. und am server log sehe ich auch, dass alle parameter
richtig gesendet werden.

zur validierung:
verwende diese validierung:
http://tetlaw.id.au/view/javascript/really-easy-field-validation

und binde sie folgendermaßen ein:

der wizard ist eine javascript klasse java script klasse die
benutzerdefinierte validierungsmethoden einbindet.

so wie ich das verstehe, wird ja wenn die validierung fehlschlägt das
formular nicht submited als update nicht aufgerufen. warum wird das
object dann nil?

hoffe ihr könnt mir helfen

Mfg Stefan

Am Mittwoch, den 20.05.2009, 00:12 +0200 schrieb Thomas R. Koll:

hallo,
danke für die antwort

den parameter übergebe ich hier
index.html.erb

<% remote_form_for(:object, :condition => “wizard.validate()”, :url =>
url_for({ :action => “update”, :activation_hash =>
@activation_hash}), :html => {:id => “wizard_edit_form”}) do |f| %>

action index:


else unless params[:edit].nil?
@object = Object.find(:first, :conditions => [“activation_hash
= ?”, params[:edit]])
if @object.activated == “nein”
@title = “Datenänderung”
@activation_hash = params[:edit]

end
end

end

und über den activation_hash sollte er ja eines finden.
das problem liegt glaube ich dabei, dass der datensatz trotz
fehlerhafter validierung einen neuen activation hash generiert. denn
wenn ich die seite mit dem url parameter edit (der ja den
activation_hash beinhaltet) schreit er auch nicht gefunden.
irgendwelche ideen?

mfg

Am Mittwoch, den 20.05.2009, 09:32 +0200 schrieb Codeblogger:

Am 20.05.2009 um 09:56 schrieb Stefan Feigl:

   @object = Object.find(:first, :conditions => ["activation_hash

= ?", params[:edit]])

heißt das eigentlich wirklich Object? Wenn ja dann bitte umbenennen.

ciao, tom


Thomas R. “TomK32” Koll || http://tomk32.de || http://ananasblau.com
just a geek trying to change the world
Skype: TomK32 || Mail: [email protected]
About Thomas R. Koll | Flickr

Hallo,
@object ist bei Dir nil.

Aus meiner Sicht klappt da schon die erste Zeile

@object = Object.find(:first, :conditions => [“activation_hash =
?”, params[:activation_hash]])

nicht.

Wie sieht denn der Parameter activation_hash bei Dir aus. Wird der
übergeben?

Außerdem prüft Dein unless-Statement nicht die Variable @object, sondern
die
Parameter params[:object].

Eventuell willst du eher sowas wie

unless @object

end

Viele Grüße
Nicolai

nein. das hab ich nur so genannt um alles ein bisschen zu vereinfachen

Am Mittwoch, den 20.05.2009, 10:21 +0200 schrieb Thomas R. Koll:

ok langsam dreh ich durch.
hab jetzt die action im controller geändert folgendermaßen:

def index
if !params[:activation].nil?
@title = “Bestätigung”
@number = 1
@object = Object.find(:first, :conditions => [“activation_hash
= ?”, params[:activation]])
if @object.nil?
render :text => “Fehler bei @object.nil? in activation”
else
if @object.activated == “ja”
@title = “Bereits aktiviert”
@number = 5
else
if @object.update_attribute(:activated, “ja”)
ServiceMail.deliver_notification({:object => “@object”})
else
render :text => "Fehler in update_attribute(:activate, "ja
“)”
end
end
end
end

if !params[:edit].nil?
  @title = "Datenänderung"
  @number = 2
  @activation_hash = params[:edit]
  @object = Object.find(:first, :conditions => ["activation_hash

= ?", @activation_hash])
if @object.nil?
render :text => “Fehler bei @object.nil? in activation”
else
if @object.activated == “ja”
@title = “Keine Änderung möglich”
@number = 5
end
end
end
end

und jetzt werden nur mehr “manchmal” die select tags richtig
ausgefülltund manchmal nicht. weiters habe ich einen neuen error:

ActiveRecord::MultiparameterAssignmentErrors (1 error(s) on assignment
of multiparameter attributes):
app/controllers/confirmation_controller.rb:75:in update' /usr/lib/ruby/1.8/webrick/httpserver.rb:104:inservice’
/usr/lib/ruby/1.8/webrick/httpserver.rb:65:in run' /usr/lib/ruby/1.8/webrick/server.rb:173:instart_thread’
/usr/lib/ruby/1.8/webrick/server.rb:162:in start' /usr/lib/ruby/1.8/webrick/server.rb:162:instart_thread’
/usr/lib/ruby/1.8/webrick/server.rb:95:in start' /usr/lib/ruby/1.8/webrick/server.rb:92:ineach’
/usr/lib/ruby/1.8/webrick/server.rb:92:in start' /usr/lib/ruby/1.8/webrick/server.rb:23:instart’
/usr/lib/ruby/1.8/webrick/server.rb:82:in `start’

hier noch die action update

def update
render :text => “#{params}”
if params[:activation_hash].nil?
render :text => “params[:activation_hash] ist nil in action
update”
else
@object = Object.find(:first, :conditions => [“activation_hash = ?”,
params[:activation_hash]])
if params[:object].nil?
render :text => “params[:object] ist nil in update”
else
if @object.update_attributes(params[:object])
@new_activation_hash = //Generierung neuer activation_hash
if @object.update_attribute(:activation_hash,
@new_activation_hash)
ServiceMail.deliver_confirmation({:object => @object})
else
render :text => “Fehler bei
update_attribute(:activation_hash, @new_activation_hash) in update”
end
else
render :text => “Fehler bei update_attributes(params[:object])
in update”
end
end
end
end

hoffe ich geb euch genug/die richtigen informationen.

mfg stefan

Am Mittwoch, den 20.05.2009, 09:32 +0200 schrieb Codeblogger:

Ok. Folgendes Update:
Die Select Tagas werden beim erstmaligen aufrufen des edit links nicht
richtig vorbefüllt. wenn ich sie dann richtig einstelle und das formualr
absende und dann erneut versuche zu ändern werden die selects richtig
befüllt. jemand eine idee wie ich den fehler suchen könnte?

hab jetzt schon fiolgendes gemacht.
ich lass mir auf der bearbeitungsseite mit dem form wo die selects
vorbelegt werden sollen folgendes ausgeben:

<% @object.attributes.each { |key, value| %>
<%= key %> | <%= value %>
<% } %>

um zu überprüfen ob das object die richtigen daten beinhaltet.
antwort: JA.

jedoch werden sie nicht in den select tags vorbelegt.
wenn ich die select tags jetzt auf die richtigen werte ändere, und das
formular absende, las sich mir auf der folgenden seite mit der
bestätigungsmeldung, dass die daten geändert wurden folgendes ausgeben:

<% @params_hash.each { |key, value| %>
<%= key %> | <%= value %>
<% } %>

und im controller in der update action an die das formular gesendet
wird:

@params_hash = params[:object]

auch hier zeigt er mir dann brav sämtliche submit daten richtig an. bei
einem erneuten ändern aufruf werden dann die selects richtig vorbelegt.

bin drauf und dran das ganze projekt zu werfen. langsam reichts mir.
entweder bin ich zu blöd 1 und 1 zusammen zu zählen oder es is ein rails
internes problem. wobei ich selbst eher glaube, dass ersteres zutrifft.

weiters habe ich noch immer das problem, dass das formular bei einem
fehler rein optisch nicht gesendet wird und die error felder markiert
werden und der focus draufgesetzt wird. im hintergrund jedoch die daten
sehr wohl gesendet werden und in die datenbank gespeichert. nach der
speicherung wird ein erneutes bestätigungsmail geshickt mit einem neuen
activation_hash. dieser neue hash überschreibt nach dem speichern auch
den alten von dem datensatz. nun siehts aber ja für den user so aus, als
ob das form nicht gesendet wurde wegen den errors. wenn der die dann
ausbessert und erneut senden will siehts für ihn “manchmal” wieder nach
nix aus und “manchmal” krieg ich den fehler mit nil.update_attributes,
da ja kein object gefunden werden konnte mit dem alten activation hash,
da dieser schon beim ersten “verdeckten” absenden geändert wurde.

bitte um hilfe und/oder tips

Am Mittwoch, den 20.05.2009, 10:56 +0200 schrieb Stefan Feigl: