You are not logged in.

  • Login

1

Monday, March 21st 2011, 10:41am

Controller überschreiben in Redmine Plugin

Hallo Leute!
Ich würde gerne in einem Plugin in Redmine den Controller überschreiben. Wie funktioniert das?

2

Monday, March 21st 2011, 11:10am

"Ein Controller überschreiben", wie meinst du das ?

Was genau hast du denn vor ?

3

Monday, March 21st 2011, 11:44am

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

wcf.bbcode.Rails.title

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

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

RubyOnRails Quellcode

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

Ich habe es nun versucht mit

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

wcf.bbcode.Rails.title

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



Die aufgerufene URL sieht so aus:
http://localhost:3000/work_time/show/exa…ser=3&year=2011

Danke für Eure Antworten! :-)

This post has been edited 2 times, last edit by "rubyonrailsman" (Mar 21st 2011, 12:07pm)


4

Monday, March 21st 2011, 1:49pm

Hi,


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

RubyOnRails Quellcode

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


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 ?

5

Tuesday, March 22nd 2011, 10:40am

Hi Vince!
Danke für Deine Antwort. Freue mich, dass ich damit dem Problem schon näher komme :-)

Meine beiden Methoden sehen so aus:

wcf.bbcode.Rails.title

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

Quoted


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

RubyOnRails Quellcode

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

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

Quoted


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 ;-))

6

Tuesday, March 22nd 2011, 12:48pm

du rufst den Link aber schon mit dem "set_sickday" Parameter auf um einen Krankheitstag zu setzen ?!

Quoted

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

RubyOnRails 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 !

7

Tuesday, March 22nd 2011, 1:32pm

Hi Vince!

Okay, peinlicher Fehler wegen der Zuweisung. Ja, ich rufe das schon mit dem sick_day-Parameter auf.

8

Saturday, March 26th 2011, 2:00pm

Denn kann ich dir auch nicht sagen warum die Methode nicht richtig funktioniert. Nach dem geposteten Code sehe ich kein Part warum es nicht gehen sollte.

Um weiter zu suchen, schau mal in den Debug Bereich.

9

Monday, March 28th 2011, 12:15pm

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

10

Monday, March 28th 2011, 6:23pm

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

Similar threads

Social bookmarks