【问题标题】:How to send data from Matlab to Rails如何将数据从 Matlab 发送到 Rails
【发布时间】:2025-12-14 21:35:01
【问题描述】:

我对 Rails 和 Web 开发非常陌生。

我在 Matlab 中生成了一堆对象,我想将这些对象发送到我的 Rails 应用程序中的数据库。谁能建议我如何做到这一点?

到目前为止,在 Rails 端,我已经为我的数据生成了基本的脚手架。我可以使用“/myobjects/new”中的表单将对象添加到我的数据库中。

在 Matlab 端,我一直在尝试使用 HTTP POST 请求添加对象,如下所示:

s = urlread('http://localhost:3000/myobjects.json','POST',{'myobject','{name1:''value1''}'})

这失败并在 Rails 控制台打印以下内容:

Started POST "/myobjects.json" for 127.0.0.1 at 2012-06-16 11:48:28 -0400
Processing by MyobjectsController#create as JSON
  Parameters: {"myobject"=>"{name1:'value1'}"}
WARNING: Can't verify CSRF token authenticity
Completed 500 Internal Server Error in 1ms

NoMethodError (undefined method `stringify_keys' for "{name1:'value1'}":String):
  app/controllers/myobjects_controller.rb:43:in `new'
  app/controllers/myobjects_controller.rb:43:in `create'

这种方法可能有点离谱,但希望上面的代码能明确我的目标。谁能告诉我如何修复我的代码,或者建议一个更好的策略来将我的数据放入 Rails 中?

编辑

目前我的 new 和 create 方法看起来像这样(但我可以根据需要更改它们)

# GET /irs/new
  # GET /irs/new.json
  def new
    @ir = Ir.new

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @ir }
    end
  end

  # POST /irs
  # POST /irs.json
  def create
    @ir = Ir.new(params[:ir])

    respond_to do |format|
      if @ir.save
       format.html { redirect_to @ir, notice: 'Ir was successfully created.' }
       format.json { render json: @ir, status: :created, location: @ir }
      else
        format.html { render action: "new" }
        format.json { render json: @ir.errors, status: :unprocessable_entity }
      end
    end
  end

【问题讨论】:

  • 您可以发布新内容并创建您的帖子吗?
  • 好的,见上面的编辑。这是您要查找的信息吗?
  • 也许使用 sprintf 创建 name1: value1 对,然后发送该字符串?
  • @Ansari 谢谢,但没有骰子。在 Matlab s = urlread('http://localhost:3000/irs.json','POST',{'ir',sprintf('{%s:%s}','field1','value1')}) 中做了这个并得到了这个 NoMethodError (undefined method ``stringify_keys' for "{field1:value1}":String)
  • JSON 不是我的强项,但我认为您必须将它们括在单引号或双引号中。所以试试 '{"%s":"%s"}'。

标签: ruby-on-rails json web-services matlab


【解决方案1】:

最后我放弃了尝试使用 matlab 的内置函数来做到这一点。相反,我导入了一个 Java 库 (Apache HttpComponents)。这是我想出的脚本。这样就完成了。

javaaddpath(['utils/httpcomponents-client-4.2/lib/httpcore-4.2.jar']);
javaaddpath(['utils/httpcomponents-client-4.2/lib/httpclient-4.2.jar']);


import org.apache.http.impl.client.DefaultHttpClient
import org.apache.http.client.methods.HttpPost
import org.apache.http.entity.StringEntity


httpclient = DefaultHttpClient();

httppost = HttpPost('http://127.0.0.1:3000/myobjects.json');
httppost.addHeader('Content-Type','application/json');
httppost.addHeader('Accept','application/json');

params = StringEntity('{"field1":"value1"}');
httppost.setEntity(params);

response = httpclient.execute(httppost);

【讨论】:

  • 用 4.2 的库试过这个,但在最后一行得到错误
【解决方案2】:

您可以通过设置来避免该特定问题

class MyobjectsController < ApplicationController
  protect_from_forgery :except => :create
  ...
end

在您的控制器中。它禁用 CSRF 令牌有效性检查。

【讨论】:

  • 好的,这个添加消除了 CSRF 警告,但它并没有解决我的问题。我仍然收到 NoMethodError 并且无法将对象添加到数据库中。不过还是谢谢你。
  • 好的,对不起。问题是您正在传输{'myobject','{name1:''value1''}'}。 Matlab 是否支持这样发送:{'myobject',{ 'name1', 'value1'}}?
  • 是的,我可以这样做,但我仍然得到基本相同的 NoMethodError。 "{name1:'value1'}":String 就变成了"{'name1','value1'}":String
  • 您可以在 Ir.new 调用之前params[:ir] = JSON.parse(params[:ir])(按照您最初的方式发送散列)。
  • 嗯...试过了,我得到一个解析器错误:JSON::ParserError (757: unexpected token at '{field1:'value1'}'): app/controllers/irs_controller.rb:50:in 'create'
最近更新 更多