3

私は 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'

このアプローチはベースから外れている可能性がありますが、上記のコードで私の目標が明確になることを願っています。コードを修正する方法や、データをレールに入れるためのより良い戦略を提案してくれる人はいますか?

編集

現時点では、私の 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
4

2 に答える 2

3

最後に、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);
于 2012-06-16T19:03:55.193 に答える
1

設定することで、その特定の問題を回避できます

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

コントローラー内。CSRF トークンの有効性チェックを無効にします。

于 2012-06-16T16:06:00.223 に答える