javascript - 如何序列化来自非表单元素的数据并使其可从 params[ :model]

标签 javascript jquery html sinatra

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

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

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

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

更新

  • 我正在使用对象类的 多个 个实例,每个实例都在一个表行中!
  • 我正在使用DataMapper,只是临时对象没有被存储!
  • 不想弄乱我的整个设置!

最佳答案

你有没有考虑ActiveResource ?您可以使用 ActiveResource 来维护对象状态。如果您的 REST API 遵循约定,那么映射资源将非常容易。

关于后半部分将数据发送回您的 Controller ,您可以存储在隐藏变量中,并且在发布时应该很容易构造回对象并将其保存到数据库中。

有点像

#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>

关于javascript - 如何序列化来自非表单元素的数据并使其可从 params[ :model],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14481528/

相关文章:

javascript - 单击播放列表项上的播放/暂停音频元素

javascript - 来自全局范围的变量在 javascript 中无法识别

javascript - 用于匹配 "Viewing 1 to 10 of 100"等字符串的正则表达式模式

javascript - 通过回调异步访问 $get

javascript - 用户自定义数据表

html - 带有图形说明的复杂圆框

javascript - 我想使用 JQuery 或 CSS 更改表格行的颜色

javascript - Jquery延迟执行脚本

javascript - jQuery 对象索引忽略 jQuery.filter()

html - 全身覆盖,内部 div 可点击