🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.ruby
7 messages
7 total messages Started by janu Fri, 25 Aug 2006 17:30
Przeciazanie nazw
#160
Author: janu
Date: Fri, 25 Aug 2006 17:30
22 lines
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
#161
Author: Marcin Mielżyński
Date: Fri, 25 Aug 2006 18:26
7 lines
991 bytes
janu wrote:
> 
> latwo mozna sie domyslic to rozwiazanie nie dziala. Moje pytanie brzmi

co nie działa ?

lopex
Re: Przeciazanie nazw
#162
Author: janu
Date: Fri, 25 Aug 2006 19:32
13 lines
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
#163
Author: Marcin Mielżyński
Date: Fri, 25 Aug 2006 22:51
46 lines
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
#164
Author: janu
Date: Sat, 26 Aug 2006 10:10
50 lines
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
#165
Author: Marcin Mielżyński
Date: Sat, 26 Aug 2006 11:19
14 lines
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
#166
Author: janu
Date: Sat, 26 Aug 2006 13:24
23 lines
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