Forum: Rails Germany Vorstellung

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Db78660a3f368ffd3dae9b18aff7854e?d=identicon&s=25 Stefan Feigl (Guest)
on 2009-05-19 23:06
(Received via mailing list)
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| %>
....
<p>
        <%= f.label :birthdate, "Geburtsdatum" %><br />
        <%= f.date_select :birthdate, :start_year =>
DateTime.now.year, :end_year => 1930, :use_month_numbers => true %>
      </p>
....
<p>
        <%= f.label :existing_damage, "Haben sich Schäden ereignet, die
noch nicht einer Versicherung gemeldet wurden?" %><br />
        <%= f.select :existing_damage, ["Ja", "Nein"], {:id =>
"object_existing_damage", :class => "validate-selection"} %>

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

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.
59528506e6297141161afcde91d677c9?d=identicon&s=25 Nicolai Reuschling (codeblogger)
on 2009-05-20 00:01
(Received via mailing list)
Hallo Unbekannter (Stefan?),
die Mailingliste hilft Dir gerne weiter, wenn Du eine konkrete Frage
formulierst.

Viele Grüße
Nicolai
978ed7ca309d5495078702096f9add03?d=identicon&s=25 Thomas r. Koll (tomk32)
on 2009-05-20 00:13
(Received via mailing list)
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?" %><br />
>        <%= 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 :)

ciao, tom

--
Thomas R. "TomK32" Koll || http://tomk32.de || http://ananasblau.com
just a geek trying to change the world
Skype: TomK32 || Mail: tomk32@gmx.de
http://flickr.com/people/tomk32
978ed7ca309d5495078702096f9add03?d=identicon&s=25 Thomas r. Koll (tomk32)
on 2009-05-20 00:14
(Received via mailing list)
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 ;-)

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: tomk32@gmx.de
http://flickr.com/people/tomk32
Db78660a3f368ffd3dae9b18aff7854e?d=identicon&s=25 Stefan Feigl (Guest)
on 2009-05-20 09:24
(Received via mailing list)
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-fi...

und binde sie folgendermaßen ein:

<script type="text/javascript">
  var wizard = new Wizard();
  wizard.addPage("<%= @title %>", "wizard_<%= @number %>");
  wizard.addValidation('wizard_form');
  wizard.showPage(0);
</script>

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:
59528506e6297141161afcde91d677c9?d=identicon&s=25 Nicolai Reuschling (codeblogger)
on 2009-05-20 09:33
(Received via mailing list)
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
Db78660a3f368ffd3dae9b18aff7854e?d=identicon&s=25 Stefan Feigl (Guest)
on 2009-05-20 09:56
(Received via mailing list)
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:
978ed7ca309d5495078702096f9add03?d=identicon&s=25 Thomas r. Koll (tomk32)
on 2009-05-20 10:22
(Received via mailing list)
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: tomk32@gmx.de
http://flickr.com/people/tomk32
Db78660a3f368ffd3dae9b18aff7854e?d=identicon&s=25 Stefan Feigl (Guest)
on 2009-05-20 10:32
(Received via mailing list)
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:
Db78660a3f368ffd3dae9b18aff7854e?d=identicon&s=25 Stefan Feigl (Guest)
on 2009-05-20 10:56
(Received via mailing list)
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: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'

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:
Db78660a3f368ffd3dae9b18aff7854e?d=identicon&s=25 Stefan Feigl (Guest)
on 2009-05-20 21:58
(Received via mailing list)
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:
This topic is locked and can not be replied to.