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.
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.