Witam,
mam taki oto problem, napisałem sobie prosty modulik, który zaklada/usówa konta shellowe na serwerze, modulik działa i wszystko jest cacy, ale… po skopiowaniu pliku z modulem do katalogu /lib railsow oraz oczywiscie w kontrolerze require pliku oraz w klasie kontrolera include modul i uzyciu funkcji modułu jak w zwyklym programie ruby dostaje błąd:
“undefined method `create_user’ for SysUser:Module”
Nie.
Jak dasz więcej kodu (jak includujesz toto i jaką ma strukturę - może być bez “mięsa”, wystarczą deklaracje module oraz class), może ktoś będzie mógł poszukać źródła problemu.
Sama procedura includowania modułu do kontrolera, którą opisałeś jest OK, podejrzewam, że to odwołanie do funkcji wewnątrz tego SysUser się sypie bo albo jest niepoprawne albo jakiś konflikt. Podeślij dokładny kod tego modułu + includów do kontrolera.
[code=“ruby”]lib/sysuser.rb:
require ‘etc’ #Moduł‚ zarządzający fizycznymi kontami user na serwerze
module SysUser #zakładanie usera o podanym haśle
def create_user(login, pass) #sprawdzamy czy user istnieje
if check_user(login) then #jesli tak to konczymy
else #jesli nie to dodajemy
system(“useradd -m -d /home/#{login} #{login}”)
p = IO.popen("/usr/bin/passwd #{login}", “w+”)
p.close_read
p.puts “#{pass}”
p.puts “#{pass}”
p.close
end
end
#usuwanie konta
def delete_user(login)
system(“userdel -r #{login}”) if check_user("#{login}")
end
#zawieszenie konta
def suspend_user(login)
system("/usr/bin/passwd -l #{login}") if check_user("#{login}")
end
#odwieszenie konta
def unsuspend_user(login)
system("/usr/bin/passwd -u #{login}") if check_user("#{login}")
end
#sprawdzenie czy taki user (juz)istnieje
def check_user(login)
Etc.passwd {|u|
return true if u.name == login
}
return false
end
end[/code]
a sam kontroler:
[code=“ruby”]require ‘sysuser.rb’
class UsersController < ApplicationController
include SysUser
render new.rhtml
def new
end
def create
cookies.delete :auth_token
# protects against session fixation attacks, wreaks havoc with
# request forgery protection.
# uncomment at your own risk
# reset_session @user = User.new(params[:user]) @user.save
SysUser::create_user("#{@user.login}", “#{@user.password}”) //tutaj chcemy zalozyc fizycznie usera na serwie (:
if @user.errors.empty?
self.current_user = @user
redirect_back_or_default(’/’)
flash[:notice] = “Rejestracja pomyślna”
else
render :action => ‘new’
end
end
Niepotrzebnie używasz namespace’a przy wywołaniu SysUser::create_user
Skoro dałeś include SysUser to wszystkie metody z modułu SysUser stają się automatycznie metodami w kontrolerze.
:: w Rubim w przeciwieństwie do PHP nie oznacza wywołania statycznej metody tylko jest używany do namespace’ów.
Jak chcesz wywołać statyczną metodę (metodę klasy) to po prostu piszesz SysUser.create_user
Spróbuj po prostu wywołać create_user
Poza tym przy require nie potrzebujesz .rb wystarczy require ‘sysuser’