在rails / lib模块中验证用户

时间:2011-03-17 18:02:47

标签: ruby-on-rails class module tcp

我想在用户尝试在我的Rails应用程序中启动TCP连接时对用户进行身份验证。这是我现有的代码,它非常简单,但应该让你知道我想做什么。

TcpServer.rb

module TcpServer

  def receive_data(data)
    (@buf ||= '') << data
    if line = @buf.slice!(/(.+)\r?\n/)
      commands = data.split(";")
      case commands[0]
      when /start/i
        if !User.authenticate(commands[1],commands[2])
          close_connection
          puts "Subscription invalid."
        else
          put "Subscription validated."
        end
      end
    end
  end

EventMachine::run do
  host = "localhost"
  port = "5587"
  EventMachine::start_server host, port, TcpServer
  puts "TcpServer started @ #{host}:#{port}"
end

end

为了从该模块访问我的用户模型,我需要提供或包含哪些内容?或者这只是一种完全错误的方法吗?如果是这样,你有什么建议?

问题是我没有使用Rails运行它。

我用它来运行它:

ruby lib/TcpServer.rb

而不是:

script/runner lib/TcpServer.rb

不包含或需要,Rails自动完成。

1 个答案:

答案 0 :(得分:0)

Dir.glob(Rails.root.join('app/models/*.rb')).each { |file| require file }

如果需要,上面的代码将会加载所有模型(如果需要,可以在语句中添加'user.rb',在上面的注释中你可能需要指定路径而不包括“.rb”部分 - &gt;“要求'用户'”)。

您应该决定是否认为这种类型的集成服务器应该是正在运行的Rails应用程序的一部分,或者可能是属于同一代码库的另一个“应用程序”。您可以在此处保留核心内部并使用自定义rake任务启动EM服务器,并通过该rake任务加载Rails环境。

namespace :tcp do  
  task :start, :needs => :environment do
    # server load and start here
  end
end

如果我要打开一种新的执行方式,那么我宁愿让它们在不同的进程中运行,以防止任何错误导致两者同时崩溃。 (我会将Resque的工作/工作人员视为如何将代码保存在同一个Rails应用程序中而不强制它们在同一进程中运行的一个很好的例子)