2

外部 API から情報を読み込んでページに表示する Sinatra アプリがあります。これは Sinatra で行われ、情報を取得して一時的なモデル インスタンス (保存されません) に配置されるため、ビュー内のすべてのプロパティに簡単にアクセスできます。

ユーザーがリンクをクリックすると、モデルインスタンスをデータベースに保存したいのですが、最後のリクエストはすでに終了しており、インスタンスがまだ生きていないため、AJAX などを介してのみ実行できると思います。対応する HTML 要素のすべての情報を抽出し、別のルートに AJAX-Post を作成する必要があると考えました。

私の問題は、モデルを作成 (および保存) できるようにしたいということです@model = Model.create(params[:model])。フォームを使用して何をすべきかは明らかですが、すべてのデータがテーブル内に表示され、テーブルの各行がモデルの 1 つのインスタンスであるため、それはオプションではありません。

上記のように使用できるように、クリックされたリンクがあるテーブル行からデータをシリアル化するにはどうすればよいですか?

アップデート

  • オブジェクト クラスの複数のインスタンスを、それぞれ 1 つのテーブル行で使用しています。
  • 私は DataMapper を使用していますが、一時オブジェクトのみが保存されていません!
  • セットアップ全体を散らかしたくない!
4

2 に答える 2

0

ActiveResourceを検討しましたか?ActiveResourceを使用して、オブジェクトの状態を維持できます。REST APIが規則に従っている場合、リソースのマッピングは非常に簡単です。

後半のデータをコントローラーに送り返すことに関しては、隠れた変数に格納することができ、投稿時にオブジェクトを構築してデータベースに永続化するのは簡単です。

何かのようなもの

#model
class MyModel < ActiveResource::Base
  # set configs here
end

# To fetch record from REST API in controller or whatever
MyModel.find(1)

#in controller on form submit or AJAX
post "/path" do
  MyModel.new(params[:myModel])
end

更新 非表示のフォームを使用せずにオブジェクトの状態を維持するには

javascriptでは次のようなものを持つことができます

var myModel = #{myModel.to_json}; #Ruby interpolation in HAML it will depend on templating language

特定のアクションで、JSONオブジェクトを更新できます

とAJAXを使用して投稿する

$.post("post/path", myModel);

その他の更新

外部JSで

function my_js_function(obj) {
/* do something useful here like setting up object hash etc
*/
}

Rubyテンプレートで

<script>
  var myObj = #{myObj.json}
  my_js_function(myObj);
</script>
于 2013-01-23T14:18:33.563 に答える
0

私はかなり簡単な解決策を見つけました。DOMから必要なすべての値を取得し、それらを配列に入れるだけでした。

application.js:

$(".enable").click(function() {
    var table_row = $(this).closest("tr");
    var model_array = new Array;
    var elements_with_information = jRow.find("[name]");

    elements_with_information.each(function() {
            // Doing some checking on which kind of element 
            // it actually is and then basically doing:
            model_array.push($(this).text());
    });

    // Constructing nested array to use `params[:model]`
    var data = { "model" : {
        "property1": model_array[0],
        "property2": model_array[1]
    }};

    // Now doing the AJAX request
    $.ajax({
        url: "/model/doshit",
        type: "POST",
        data: data
    });
});
于 2013-01-23T16:06:20.990 に答える