2

我有一个 Sinatra 应用程序,它从外部 API 加载信息并将其显示在页面上。这是在 Sinatra 中完成的,它获取信息并将其放置为临时模型实例(未保存),因此更容易在视图中访问其所有属性。

现在,当用户单击链接时,我希望将模型实例保存到数据库中,我认为这只能通过 AJAX 等来完成,因为最后一个请求已经完成,并且没有一个实例仍然存在。我以为我需要提取相应 HTML 元素的所有信息,然后将 AJAX-Post 发送到另一条路线。

我现在的问题是,我希望能够使用@model = Model.create(params[:model]). 使用表单可以很清楚地做什么,但这不是一个选项,因为所有数据都显示在一个表中,并且每个表行都是模型的一个实例。

如何序列化单击链接所在的表行中的数据,以便可以如上所述使用它?

更新

  • 我正在使用对象类的多个实例,每个实例都在一个表行中!
  • 我正在使用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 中获取所有需要的值并将它们放入一个数组中!

应用程序.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 回答