Probleme mit Routes bzw. mit RESTful

Hallo,

ich benutze Rails 2 mit entsprechender REST Unterstüzung. Leider gibt
meine Literatur dazu nichts her.

Ich möchte in meiner Tabelle hinter einem Feld mit einem Datum ein Link
mit einem Plus Zeichen ausgeben. Der Link soll dann den Datensatz
übernehmen, das Datum um einen Tag erhöhen und dann in die Datenbank
schreiben.

Wenn ich jetzt explizit eine :action => :plus aufrufe geht das nicht.
Verstehe ich ja auch. Passt wohl nicht in die Konvention mit DRY und
REST.

Aber wie löst man denn so ein Problem. Über Routing oder Helper?

Grob beschrieben: Ein Link wird angeklickt, eine Methode aufgerufen die
eine Berechnung durchführt, dann wird der Wert in die Datenbank
geschrieben. Wie setzt man das um?

Danke für die Hilfe.

Holger

Am 25.04.2008 um 21:50 schrieb Holger Hänisch:

ich benutze Rails 2 mit entsprechender REST Unterstüzung. Leider gibt
meine Literatur dazu nichts her.

API docs!
und quellcode natürlich.

Wenn ich jetzt explizit eine :action => :plus aufrufe geht das nicht.
Verstehe ich ja auch. Passt wohl nicht in die Konvention mit DRY und
REST.

Aber wie löst man denn so ein Problem. Über Routing oder Helper?

Falls sich “geht das nicht” in der Art äußert wie ich’s in Erinnerung
hab
dann ist deine Lösung routes:

map.resources :mymodel, :collection => {:plus => :put}

Den Rest weiß die doku, auch was man neben :put noch nehmen kann.

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]

hi holger,

wenn ich das problem richtig verstehe, möchtest du einen schon
gespeicherten datenbank-eintrag ändern.

wenn du schon eine “map.resources :my_model_name” - regel für das
betreffende model im routing stehen hast, brauchst du dazu weder
zusätzliches routing noch helper – das geht ganz “restful” mit einem
PUT (der von rails automatisch auf die update-methode des controllers
gemappt wird).

rails macht das mapping, wenn es vom client entweder einen HTTP PUT
bekommt, oder wenn für den parameter “_method” der wert put übergeben
wird. wenn du im template form_for(@my_instance) verwendest, fürgt
rails den _method - parameter automatisch dem formular hinzu, sonst
ist etwas mehr handarbeit gefordert um den parameter reinzubekommen
(zusätzlicher parameter für form_tag o.ä., oder hidden field).

sorg dann dafür, dass die update-methode beim anklicken des (+) alle
infos bekommt, die sie zum ändern des datensatzes benötigt – id und
entweder direkt das neue datum, oder eine info um wieviele tage das
datum geändert werden soll.

nachdem du viele werte in einer tabelle stehen hast, könnte button_to
auch hilfreich sein - siehe rails api doku:
http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#M000914
.

hope this helps!

viele
grüße,phillip


Am 25.04.2008 um 21:50 schrieb Holger Hänisch:

achso!

rest-mäßig erstellst du ein neues objekt, also sollte es ein POST auf
die collection des models werden.
lass doch den request auf create gehen, und gib beim klicken dex (+)
die id des zu kopierenden datensatzes mit (z.b. als “create_from_id”).
in der create-methode wird dann unterschieden ob die create_from_id
mitkommt, wenn ja wird der datensatz “geklont” und mit geändertem
datum neu gespeichert, wenn nein wird ein normaler create. dagegen
ist imho nichts einzuwenden.

viele
grüße,phillip


Am 26.04.2008 um 00:01 schrieb Holger Hänisch:

Am 26.04.2008 um 00:07 schrieb Phillip O.:

achso!

rest-mäßig erstellst du ein neues objekt, also sollte es ein POST
auf die collection des models werden.
lass doch den request auf create gehen, und gib beim klicken dex
(+) die id des zu kopierenden datensatzes mit (z.b. als
“create_from_id”). in der create-methode wird dann unterschieden ob
die create_from_id mitkommt, wenn ja wird der datensatz “geklont”
und mit geändertem datum neu gespeichert, wenn nein wird ein
normaler create. dagegen ist imho nichts einzuwenden.

Sorry, aber das ist einfach nur dreckiger Code und verwirrt auch
schnell den nächsten Programmierer.

eine zusätzliche Methode lässt sich viel schneller finden und schon
allein vom Namen verstehen.
Man spart ja auch die lästigen Kommentare damit :wink:

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]

Phillip O. wrote:

hi holger,

wenn ich das problem richtig verstehe, möchtest du einen schon
gespeicherten datenbank-eintrag ändern.

Nicht ganz. Ich möchte den schon gespeicherten Datenbankeintrag nochmals in
die Datenbank schreiben, nur soll das Feld Datum einen Tag addiert
bekommen.

Eintrag:

ID/Datum/Ereignis
50/2008-05-01/Urlaub (+)

ein Klick auf das (+) soll erzeugen:

51/2008-05-02/Urlaub

Hierfür suche ich den “richtigen” Weg. In Rails < 2 würde ich einfach eine Methode
schreiben die in meinem entsprechenden Controller das erledigt. In Rails
2 ist das anscheinend nicht so einfach möglich. Ich bekomme es auf jeden
Fall nicht hin.

Vermutet habe ich aber das ich das über Routing lösen muss. Daher werde ich auf
jeden Fall den Vorschlag von Tom ausprobieren. Allerding ist das alles
nicht sehr DRY wie ich das vor habe. Da ich ja in der Methode für (+) fast
nichts anderes mache als in der Methode create die ich ja sowieso schon
habe.

Holger

hallo,

Am 26.04.2008 um 00:10 schrieb Thomas R. Koll:

und mit geändertem datum neu gespeichert, wenn nein wird ein
normaler create. dagegen ist imho nichts einzuwenden.

Sorry, aber das ist einfach nur dreckiger Code und verwirrt auch
schnell den nächsten Programmierer.

na, noch ganz schon aggressiv um die zeit …
vorneweg: deine lösung ist ebensogut und wenn man rest mal ausser acht
lässt wäre es wirklich klarer eine separate methode zu machen.
dreckiger code ist aber was anderes.

eine zusätzliche Methode lässt sich viel schneller finden und schon
allein vom Namen verstehen.

map.resources :mymodel, :collection => {:plus => :put} muss auch
erstmal einer finden und verstehen …

die vorteile meiner lösung sind, dass man nicht am routing schrauben
muss und innerhalb der rest-konventionen bleibt. aber wie schon oben
geschrieben, ich will nicht behaupten, dass das eine besonders schöne
lösung ist. trotzdem kann man das ganze einigermaßen verständlich
coden (nicht getestet) …

def create
new_record_attributes = if params[:create_from_id]
attributes = MyModel.find(params[:create_from_id]).attributes
attributes.starts_at = attributes.starts_at + 1.day
attributes
else
params[:my_model]
end
MyModel.create!(new_record_attributes)
end

Man spart ja auch die lästigen Kommentare damit :wink:

??

viele
grüße,phillip_______________________________________________
rubyonrails-ug mailing list
[email protected]
http://mailman.headflash.com/mailman/listinfo/rubyonrails-ug

Am 26.04.2008 um 00:42 schrieb Phillip O.:

Am 26.04.2008 um 00:10 schrieb Thomas R. Koll:

Sorry, aber das ist einfach nur dreckiger Code und verwirrt auch
schnell den nächsten Programmierer.

na, noch ganz schon aggressiv um die zeit …

Tut mir leid, war nich so gemeint, die späte Zeit, Zahnschmerzen und
ZZ Top verwirren das Zentralhirn

eine zusätzliche Methode lässt sich viel schneller finden und
schon allein vom Namen verstehen.

map.resources :mymodel, :collection => {:plus => :put} muss auch
erstmal einer finden und verstehen …

übrigens, falls es Holger noch nicht kennt: rake routes

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]

Am 26.04.2008 um 09:33 schrieb Thomas R. Koll:

ZZ Top verwirren das Zentralhirn
ok :slight_smile:

viele
grüße,phillip

On Apr 26, 2008, at 12:10 AM, Thomas R. Koll wrote:

und mit geändertem datum neu gespeichert, wenn nein wird ein
normaler create. dagegen ist imho nichts einzuwenden.

Sorry, aber das ist einfach nur dreckiger Code und verwirrt auch
schnell den nächsten Programmierer.

Wieso das? Bei dieser Lösung finde ich den Code zum Erzeugen in
create, d.h. dort, wo ich ihn erwarte. Erscheint mir trotz des if-
statements genau so gültig wir die Fallunterscheidung per routes.rb.

Ist ansonsten wahrscheinlich Geschmackssache. REST-mäßig wäre das Neu-
Anlegen in diesem Kontext auf jeden Fall ein POST, nicht ein PUT.

Viele
Grüße,Stefan

Stefan T., http://www.innoq.com/blog/st/

Vielen Dank für die Hilfe und die Vorschläge.

Ich habe mich dann auch noch mal in das Thema reingelesen und das
Tutorial von Wirdemann und Baustert studiert. Die schlage wie Tom für
mein Problem die Lösung über Routen vor. Funktioniert auch mit kleinen
Veränderungen.

routes.rb
map.resources :fehlzeitens, :member => { :plus => :post }, :path_prefix
=> ‘/mitarbeiters/:mitarbeiter_id’

ich will das mitarbeiter_id übergeben, weil ich einen before_load Filter
habe der immer den aktuellen Mitarbeiter einliest.

view:

<%= button_to '+', plus_fehlzeiten_path(@mitarbeiter,fehlzeiten), :action => 'plus' %>

mit link_to funktioniert es leider nicht. Das führt zu einer sehr
hässlichen Tabelle. Kann man da noch was machen?

Holger

Am 26.04.2008 um 20:02 schrieb Holger Hänisch:

view:

<%= button_to '+', plus_fehlzeiten_path(@mitarbeiter,fehlzeiten), :action => 'plus' %>

mit link_to funktioniert es leider nicht. Das führt zu einer sehr
hässlichen Tabelle. Kann man da noch was machen?

das schon erwähnte rake routes sagt dir welche helper methoden erzeugt
werden, einfach _path anhängen. Aber wahrscheinlich wird keiner für dich
erzeugt, daher sollte das hier es tun.

button_to ‘+’, {:controller => ‘fehlzeiten’, :action =>
‘plus’, :mitarbeiter_id => @mitarbeiter.id, … }

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]

Geht natürlich doch mit link_to. Einfach :method => :post mitgeben.

Holger

Thomas R. Koll wrote:

Am 26.04.2008 um 20:02 schrieb Holger H䮩sch:

view:

<%= button_to '+', plus_fehlzeiten_path(@mitarbeiter,fehlzeiten), :action => 'plus' %>

mit link_to funktioniert es leider nicht. Das f?u einer sehr
hä³³lichen Tabelle. Kann man da noch was machen?

das schon erw䨮te rake routes sagt dir welche helper methoden erzeugt
werden, einfach _path anh䮧en. Aber wahrscheinlich wird keiner f?h
erzeugt, daher sollte das hier es tun.

Helper wird erzeugt. Siehe oben: “plus_fehlzeiten_path”.

Was mich stört ist die Methode an sich. Also ich meine die Methode
button_to zu benutzen. Siehe mein Bild. Tabelle wird stark
auseinandergedehnt. Ein einfacher Link wäre mir da lieber. Da es aber um
POST geht, wird ja nix übertragen bei einem klick auf einen Link. Gibt
es dafür eine Lösung?

Holger

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs