Controller überschreiben in Redmine Plugin

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Hi Vince!
    Ich meinte, das so:

    Wenn ich im Contoller einer Ruby on Rails Applikation in einem Methodenaufruf einen Wert ändere,
    dann hat dieser keine Auswirkungen auf die Applikation selbst. Die Applikation verhält sich so,
    als wenn ich diese Änderung nicht getätigt hätte. Mir scheint, als ob ich das Routing noch nicht
    verstanden habe, aber die aufgerufene URL sieht so aus, als wenn sie in dem Controller
    die Action show aufrufe.
    Ich habe jetzt den Tipp erhalten, dass es an der @link_params liegen würde.
    Ich schaue mir diese mal an.

    Was ich vorhabe:
    Ich habe ein Redmine Plugin und möchte dieses erweitern. Mit dem Plugin kann man Urlaubstage verwalten:
    Man klickt auf einen Kalendereintrag, der Eintrag wird markiert und wird via dem Link "set holiday on this date"
    als Urlaubstag markiert.
    Das gleiche wollte ich jetzt für Krankheitstage erreichen, also via link "set sickness on this date" den Tag
    als Krankheitstag markieren. Leider funktioniert das Ganze nicht.

    Der Link "set holiday on this date" verweist auf die Action "show" im Controller. Die Action show ruft dort
    die private Methode "set holiday" auf, die mittels eines

    Quellcode

    1. WtHolidays.create(...)
    den Urlaubstag in der Datenbank setzt.

    Der Link "set sickness on this date" verweist ebenso auf die Action "show" und dort wird dann die Action
    "set_sicknessday" aufgerufen, die mittels

    Quellcode

    1. WtSicknessDay.create(...)
    den Krankheitstag in der Datenbank setzt.
    Der Krankheitstag wird nicht in der Datenbank gesetzt. Ich habe schon geschaut, ob mein Model defekt ist,
    aber via Konsole konnte ich den Krankheitstag setzen.

    Stutzig macht mich auch, dass wenn ich in der Methode set_holiday etwas ändere,
    diese Änderung sich nicht auswirkt.

    Die Methode show sieht so aus:

    Quellcode

    1. def show
    2. find_project;
    3. authorize;
    4. prepare_values;
    5. ticket_pos;
    6. prj_pos;
    7. ticket_del;
    8. hour_update;
    9. prepare_tickets_array;
    10. member_add_del_check;
    11. update_daily_memo;
    12. set_holiday;
    13. set_sickday;
    14. @custom_fields = TimeEntryCustomField.find(:all);
    15. @link_params.merge!(:action=>"show");
    16. end
    Alles anzeigen

    Ich habe es nun versucht mit

    Quellcode

    1. :before_filter set_sickday, :only => [:show]
    und dann funktioniert es.

    Das heißt, dass es läuft, aber ich sehe, dass mir da noch ein Verständnis fehlt, denn es kann ja nicht sein,
    dass, wenn ich in einer (privaten) Methode des Controllers etwas verändere, sich das nicht
    auf das Verhalten auswirkt. Da muss irgendwo was passieren, dessen ich mir nicht bewusst bin.

    Ich bekam daher den Tipp, dass es an "@link_params" liegen würde.

    Habt Ihr eine Ahnung, warum ich nicht etwas in einer privaten Methode ändern kann
    und stets das ursprüngliche Verhalten sich zeigt?

    Meine @link_params sieht so aus:

    Quellcode

    1. @link_params = {:controller=>"work_time", :id=>@project,
    2. :year=>@this_year, :month=>@this_month, :day=>@this_day,
    3. :user=>@this_uid, :prj=>@restrict_project};



    Die aufgerufene URL sieht so aus:
    localhost:3000/work_time/show/…11-03-17&user=3&year=2011

    Danke für Eure Antworten! :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von rubyonrailsman ()

  • Hi,


    durch die before_filter Methode würde deine Showmethode so aussehen:

    Quellcode

    1. def show
    2. set_sickday;
    3. find_project;
    4. authorize;
    5. prepare_values;
    6. ticket_pos;
    7. prj_pos;
    8. ticket_del;
    9. hour_update;
    10. prepare_tickets_array;
    11. member_add_del_check;
    12. update_daily_memo;
    13. set_holiday;
    14. @custom_fields = TimeEntryCustomField.find(:all);
    15. @link_params.merge!(:action=>"show");
    16. end
    Alles anzeigen


    Wie sehen denn die Methoden set_holiday und set_sickday aus ? Funktioniert die Methode set_holiday denn, wenn du die set_sickday Methode über den before_filter aufrufst ?


    Ich denke eher das die beiden Methoden sich beissen. Ggf. beim erweitern eine Instanzvariable nicht verändert ?
  • Hi Vince!
    Danke für Deine Antwort. Freue mich, dass ich damit dem Problem schon näher komme :)

    Meine beiden Methoden sehen so aus:

    Quellcode

    1. def set_holiday
    2. user_id = params["user"] || return;
    3. if set_date = params['set_holiday'] then
    4. WtHolidays.create(:sick_day=>set_date, :created_on=>Time.now, :created_by=>user_id);
    5. end
    6. if del_date = params['del_holiday'] then
    7. holidays = WtHolidays.find(:all, :conditions=>["holiday=:h and deleted_on is null",{:h=>del_date}]);
    8. holidays.each do |h|
    9. h.deleted_on = Time.now;
    10. h.deleted_by = user_id;
    11. h.save;
    12. end
    13. end
    14. end
    15. def set_sickday
    16. user_id = params["user"] || return;
    17. if set_date = params['set_sickday'] then
    18. WtSickDays.create(:sick_day=>set_date, :created_on=>Time.now, :created_by=>user_id);
    19. end
    20. if del_date = params['del_sickday'] then
    21. sickdays = WtSickDays.find(:all, :conditions=>["sick_day=:s and deleted_on is null", {:s=>del_date}]);
    22. sickdays each do |s|
    23. s.deleted_on = Time.now;
    24. s.deleted_by = user_id;
    25. s.save;
    26. end
    27. end
    28. end
    Alles anzeigen


    Funktioniert die Methode set_holiday denn, wenn du die set_sickday Methode über den before_filter aufrufst ?

    Ja, dann funktioniert die Methode set_holiday auch. DIe funktioniert irgendwie immer ;) Selbst wenn ich in deren erster Bedingung

    Quellcode

    1. if set_date != params['set_holiday'] then
    2. WtHolidays.create(:sick_day=>set_date, :created_on=>Time.now, :created_by=>user_id);
    3. end

    schreibe, verhält sie sich genauso wie vor der Änderung ;)


    Ich denke eher das die beiden Methoden sich beissen. Ggf. beim erweitern eine Instanzvariable nicht verändert ?

    Die einzige Instanzvariable die dabei benutzt wird ist m. M. n. @link_params. Muss ich da was verändern? Denke nicht, oder???
    (Fragt ein blutiger Anfänger ;-))
  • du rufst den Link aber schon mit dem "set_sickday" Parameter auf um einen Krankheitstag zu setzen ?!
    /work_time/show/exampleproject?day=17&month=3&set_sickday=2011-03-17&user=3&year=2011


    Diese Zeile ist eine Zuweisung und kein Vergleich:

    Quellcode

    1. if set_date = params['set_holiday'] then


    Du kannst du nicht einfach ein != nutzen um die Negation zu erhalten. Das wird nur gehen wenn du vorher ein == hättest !
  • Hallo Vince!

    Danke nochmal für Deine Antwort. Ich vermute, dass sich die beiden Methoden irgendwie "beissen". Wenn man den before_filter anwendet, klappt es ja. Trotzdem liegt die wahre Lösung immer noch im Verborgenen ;)
    Mit der Zeit werde ich wohl die Lösung finden, ich hab jetzt einfach mal weiter das Ganze entwickelt und den before_filter eingesetzt. Damit klappt es ja. Vielleicht habe ich auch das Routing noch nicht so ganz verstanden.
    Jedenfalls macht die Entwicklung mit Ruby on Rails viel Spaß, denn man kann damit schnell Erfolge erzielen.

    Wenn ich die Lösung gefunden haben haben sollte, werde ich sie hier posten.

    Und danke noch für den Link. Vielleicht finde ich dadurch auch die Lösung :)

    Viele Grüße,
    rubyonrailsman
  • Okay, ich denke, ich weiß, an was es lag:

    ich hatte von dem plugin eine sicherheitskopie gemacht und nur den ordner, in dem das plugin lag umbenannt.
    Als ich diesen eben löschte (zuerst mit rake db:migrate:plugins name=redmine_workplanner version=0, dann den ordner aus dem redmine-1.1.1-Verzeichnis löschen),
    funktionierte die Funktion wie sie es sollte ohne before_filter :)

    Er hat also zwei Controller mit gleichem Namen gehabt (jeweils in anderen Ordnern) und konnte das wohl nicht auflösen :)

    Mein Plugin ist jetzt fast fertig. Muss mir nur noch nen anderen Namen überlegen, da ich bisher ein schon vorhandenes Plugin modifiziert habe
    und ich nicht dem Original-Entwickler ins Gehege fuschen will.

    Viele Grüße,
    rubyonrailsman