użycie modułów w aplikacji

Napisałem prosty moduł:

module Test def self.Test ... end end
W kontrolerze wpisuje:

[code=ruby]require ‘test’

Test.Test[/code]
Dostaje komunikat, że funkcja Test w module Test nie istnieje.

module Test
def self.test

end
end

include Test
Test.test

działa dla mnie

W jakim kontrolerze? Piszesz to w czystym Ruby czy próbujesz to jakoś odpalić w Railsach? Przede wszystkim jednak: wklej stacktrace!

To pewnie tego, że jak zrobisz require ‘test’ to ładujesz jakiś kawałek biblioteki Test::Unit zamiast swojego pliku test.rb. Strzelam, że to jest przyczyną problemów.

jak wpisuje include to otrzymuje komunikat:

undefined method `include' for #...

Ech wklej jakiś porządny kawałek kodu i napisz gdzie to robisz

Wygląda to tak:
lib/test.rb

module Test def self.test ... end end
app/controllers/project.rb

... def move include Test end ...

Dobrze, że wyciąłeś resztę kodu! Szkoda byłoby gdyby ktoś z tego forum ukradł Twój pomysł.

Przede wszystkim metody w Ruby nazywamy małymi literami. Camel case zarezerwowany jest dla stałych, m.in. nazw klas i modułów.

Co do problemu: jeśli chcesz używać metody z modułu w kontrolerze, musisz zdefiniować ją jako metodę instancji (def test zamiast def self.test). W obecnym przypadku jest ona dostępna jako metoda klasowa: ProjectController.test.

Edit: zapomniałbym, przenieś include z definicji metody do klasy!

To jest kod przykładowy, a nie mój konkretny kod, ale w odzwierciedla on to o co mi chodzi i masz racje metode w modelu mam z małej litery, już poprawiam.

Narazie include nie działa, a wpisanie słowa self jest tutaj celowe. Chcę bowiem odwoływać się do metody przez nazwę modułu a nie czynić tego czymś a’la globalnym.

Zamiast w definicji metody, include powinno być w ciele klasy, czyli nie:

class Foo def bar include Test end end
Musi być

class Foo include Test def bar end end

Przeniosłem include z metody do klasy i teraz przy wywołaniu kodu:

Test.test

mam taki komunikat:

undefined method `test' for Test:Module

Po restarcie serwera railsów i po zmianie

include Test

na include ::Test
pojawia się komunikatRouting Error uninitialized constant Test

A czemu wywołujesz to tak, przez Test.test?

Kofel a czemu nie ? Twoje ostatni post zupełnie nic nie wnosi. Wybacz jeśli nie jestem w porządku, ale jak piszesz post to uważam, że powinien on posiadać jakąś wskazówkę. Teraz ogolnie mam problem z include, bo czy dam bez tych dwóch dwukropków czy bez to i tak wyświetla błąd że nie ma takiej stałej.

Zrobiłeś require? Polecam nazwać moduł i plik inaczej niż Test

kazali mi robić include a nie require, to które w końcu używać i czym to się różni ?

To konkretniej plik nazwany jest NestedTree.rb a klasa nazywa się NestedTree z merodami: up, down, add, up_translation, down_translation, add_translation (cos_translation moge zmienić na cos_t) i proszę w tym miejscu nie nakłaniać mnie na skorzystanie z pluginów bo wiele pluginów jest bardzo niedopracowanych i z nich poprostu nie chcę korzystać, chyba że nie mam innego wyjścia.

zmieniłem include NestedTree na require ‘nested_tree’ i teraz mam undefined method `up translation' for NestedTree:Module

Bragi dobry link podał. Jak się nie zna różnicy między require load include extend to znaczy ze warto kupić książkę i przeczytać podstawy.

paneq masz całkowitą rację i prawdopodobnie tak zrobię jednak teraz potrzebuję to uruchomić bo ileż to czasu można siedzieć nad jednym problemem.

Byłoby łatwiej jakbyśmy widzieli stacktrace i kod tych plików. Najlepiej jako gist albo na pastie. Chcielibyśmy pomóc ale nie ułatwiasz nam tego procesu za bardzo.