2

私は一種のルビーオンラインターミナルを実装しています(練習用です)。「端末」の入力を評価するメソッドを呼び出すために、単純な js Web アプリケーションから AJAX を使用しています。環境の問題を回避し、ユーザーが独自のオブジェクトを作成できるようにするために、「バインディング」オブジェクトを使用していました。問題は、バインディングを永続化する方法がわからないことです。

私の最初のアイデアは、ユーザーがアプリケーションにアクセスするたびに、投稿リクエスト間で持続するバインディングを作成することでした。その瞬間、一意のキーと新しいバインディングを使用して、キーとオブジェクトのペアが作成されます。次に、キーがクライアントに渡されます。ユーザーが ajax 経由で評価する文字列を送信すると、キーが送信されます。次に、バインディング オブジェクトを取得して更新します。

私は次のようなものを試しました:

class TerminalController
    @@bindings = {}

    def index
        @token = keyToken
        @@bindings[@token] = getBinding
    end

    private

        def keyToken
            Digest::MD5.hexdigest(Time.now.to_s)
        end

        def getBinding
            # declare methods for all bindings
            # ...
            binding
        end
end

しかし、実行時に、コードはキーと値のペアの作成に失敗します。実際、その行の後に実行しようとしたものはすべて失敗します。理由がわかりません。

実際、バインディングをシリアル化できれば機能すると思いますが、ネットワークの遅延とバインディングの潜在的な成長のため、非効率になる可能性があると思います。

4

1 に答える 1

0

残念ながら、ほとんどの Ruby 実装でバインディングをシリアライズする方法はないと思います。バインディングを Marshal.dump しようとすると、MRI で TypeError が発生します ( Marshalは、Ruby でオブジェクトをシリアル化するための組み込みライブラリです)。

あなたがやろうとしていることを行うには、もっと他の方法があるかもしれません。ただし、バインディングをシリアル化する必要がある場合は、MagLevを参照してください。その実装は、任意のオブジェクトを永続化できるように設計されています。

于 2011-11-07T19:17:54.603 に答える