Thread View: pl.comp.lang.ruby
7 messages
7 total messages
Started by janu
Fri, 25 Aug 2006 17:30
Przeciazanie nazw
Author: janu
Date: Fri, 25 Aug 2006 17:30
Date: Fri, 25 Aug 2006 17:30
22 lines
1840 bytes
1840 bytes
Witam,
Mam kolejny problem z Ruby, konkretniej z Railsami. Chcialbym
przeciazyc istniejaca funkcje z railsowy helperow (ta do nazywania po
ludzku czasu), ale nie w sposob standardowy (czyli przeciazajac go w
swoim helperze), a sciagajac ta funkcje z bazy danych (abstrahuje w tym
momencie od bezpieczenstwa) i evalujac. Moj kod wyglada tak:
eval "module ApplicationHelper
def tralalala
return 'hahaha'
end
end"
Wszystko jest wewnatrz funkcji z rodzaju before_filter. Niestety, jak
latwo mozna sie domyslic to rozwiazanie nie dziala. Moje pytanie brzmi
- jak to rozwiazac najlepiej, zeby dzialalo - zakladajac, ze funkcja
BEDZIE w bazie, oczywiscie bez zmieniania nazwy funkcji, ktora
wywoluje.
Pozdrawiam
Jachu
Re: Przeciazanie nazw
Author: Marcin Mielżyński
Date: Fri, 25 Aug 2006 18:26
Date: Fri, 25 Aug 2006 18:26
7 lines
991 bytes
991 bytes
janu wrote: > > latwo mozna sie domyslic to rozwiazanie nie dziala. Moje pytanie brzmi co nie działa ? lopex
Re: Przeciazanie nazw
Author: janu
Date: Fri, 25 Aug 2006 19:32
Date: Fri, 25 Aug 2006 19:32
13 lines
1581 bytes
1581 bytes
> > latwo mozna sie domyslic to rozwiazanie nie dziala. Moje pytanie brzmi > > co nie działa ? Wywolujac posrednio distance_of_time_in_words poprzez time_ago_in_words, gdzie distance_of_time_in_words staram sie przeciazyc, wywoluje sie tak naprawde stare distance_of_time_in_words. I to mi nie dziala - bo chcialbym uzywac mojej funkcji. Wiec da sie to jakos rozwiazac? Pozdrawiam Jachu
Re: Przeciazanie nazw
Author: Marcin Mielżyński
Date: Fri, 25 Aug 2006 22:51
Date: Fri, 25 Aug 2006 22:51
46 lines
2328 bytes
2328 bytes
janu wrote:
>>> latwo mozna sie domyslic to rozwiazanie nie dziala. Moje pytanie brzmi
>> co nie działa ?
>
> Wywolujac posrednio distance_of_time_in_words poprzez
> time_ago_in_words, gdzie distance_of_time_in_words staram sie
> przeciazyc, wywoluje sie tak naprawde stare distance_of_time_in_words.
> I to mi nie dziala - bo chcialbym uzywac mojej funkcji.
>
> Wiec da sie to jakos rozwiazac?
>
1. W Rubym nie istnieje pojęcie przeciążania metod ;) - możliwe że
perlowe multimetody będą w 2.0
2. Podejrzewam że chodzi o widoczność helpera z widoku a nie kontrolera
więc:
w twoim kodzie eval tworzy nowy moduł znajdujący się w bieżącej klasie,
który nie ma nic wspólnego z właściwym. Aby otworzyć istniejący wyżej
moduł musisz wyjść z przestrzeni klasy w której robisz eval poprzez
operator zakresu '::'
eval %{
module ::ApplicationHelper
def tralalala
'hahaha'
end
end
}
ale tak czy inaczej ładniej będzie:
ApplicationHelper.module_eval %{
def tralalala
'hahaha'
end
}
Tutaj już nie ma potrzeby robienia '::' (o ile byłby konflikt) bo
odwołanie sugeruje Rubiemu że moduł już istnieje i jest dostępny.
jeśli chcesz pobrać moduł ze stringa:
Object.const_get "ApplicationHelper"
lopex
Re: Przeciazanie nazw
Author: janu
Date: Sat, 26 Aug 2006 10:10
Date: Sat, 26 Aug 2006 10:10
50 lines
2988 bytes
2988 bytes
Witam,
Marcin Mielżyński wrote:
> 1. W Rubym nie istnieje pojęcie przeciążania metod ;) - możliwe że
> perlowe multimetody będą w 2.0
Rzeczywiscie, zle nazwalem to, o co mi chodzi :) Swoja droga - na czym
polegaja owe perlowe multimetody, bo w perlu nigdy nie programowalem?
Chodzi mi o samo pojecie multimetody.
> 2. Podejrzewam że chodzi o widoczność helpera z widoku a nie kontrolera
>
> więc:
>
> w twoim kodzie eval tworzy nowy moduł znajdujący się w bieżącej klasie,
> który nie ma nic wspólnego z właściwym. Aby otworzyć istniejący wyżej
> moduł musisz wyjść z przestrzeni klasy w której robisz eval poprzez
> operator zakresu '::'
>
> eval %{
> module ::ApplicationHelper
> def tralalala
> 'hahaha'
> end
> end
> }
>
> ale tak czy inaczej ładniej będzie:
>
> ApplicationHelper.module_eval %{
> def tralalala
> 'hahaha'
> end
> }
>
> Tutaj już nie ma potrzeby robienia '::' (o ile byłby konflikt) bo
> odwołanie sugeruje Rubiemu że moduł już istnieje i jest dostępny.
Niestety, probowalem na szybko wprowadzic Twoje rozwiazania w swoj kod
i nie dzialaly. Jak znajde troche wiecej czasu, to przetestuje je
troche lepiej, a chwilowo sprawe "zalatwilem" tworzac swoja wersje
distance_of_time_in_words, w ktorej wywoluje evalowanie metody
zdefiniowanej w bazie danych (ta sama nazwa z sufiksem _alt), jesli ta
metoda jeszcze nie istnieje w moim srodowisku (wprowadzam sobie pole,
trzymajace informacje o tym, czy ta metoda istnieje). Rozwiazanie
metoda cepa, bardzo mi sie nie podoba, ale jak na ta chwile jedyne
dzialajace.
Pozdrawiam
Jachu
Re: Przeciazanie nazw
Author: Marcin Mielżyński
Date: Sat, 26 Aug 2006 11:19
Date: Sat, 26 Aug 2006 11:19
14 lines
1484 bytes
1484 bytes
janu wrote: > Chodzi mi o samo pojecie multimetody. Właśnie przeciążanie: http://search.cpan.org/~dconway/Class-Multimethods/lib/Class/Multimethods.pod w Perlu 6 jest już bardziej zakręcone > Niestety, probowalem na szybko wprowadzic Twoje rozwiazania w swoj kod > i nie dzialaly. Jak znajde troche wiecej czasu, to przetestuje je działają (zakładając że eval robisz w akcji a helpera wołasz z widoku) lopex
Re: Przeciazanie nazw
Author: janu
Date: Sat, 26 Aug 2006 13:24
Date: Sat, 26 Aug 2006 13:24
23 lines
2074 bytes
2074 bytes
Witam, Marcin Mielżyński wrote: > janu wrote: > > Chodzi mi o samo pojecie multimetody. > > Właśnie przeciążanie: > http://search.cpan.org/~dconway/Class-Multimethods/lib/Class/Multimethods.pod > > w Perlu 6 jest już bardziej zakręcone > > > Niestety, probowalem na szybko wprowadzic Twoje rozwiazania w swoj kod > > i nie dzialaly. Jak znajde troche wiecej czasu, to przetestuje je > > działają (zakładając że eval robisz w akcji a helpera wołasz z widoku) Jak juz wczesniej pisalem eval robie w before_filter, ale watpie czy to ma jakis zwiazek z niedzialaniem tego... Pozniej to jeszcze przetestuje, byc moze zrobilem jakis prosty blad i dlatego to nie poszlo. Pozdrawiam Jachu
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads