2017-12-07 13 views
1

ReactJSに登録フォームがあり、JSON形式のユーザーデータ(名前、電子メール、パスワード)を自分のrails APIに送信したいとします。 RailsはJSONデータをパラメータに解析しません。Rails JSONパラメータが解析されない

ルート

Rails.application.routes.draw do 
    get '/list_users' => 'users#index' 
    post '/register_user' => 'users#register' 
end 

ユーザーコントローラ

class UsersController < ApplicationController 
    def index 
     @users = User.all 
     render json: @users 
    end 

    def register 
     puts params.inspect 
     @user = User.new(name: 'TEST', :email => params[:email], :password => params[:password]) 
     #@user = User.new(name: 'User', email: '[email protected]', password: 'password') (this works) 
     @user.save 
    end 
end 

はparams.inspect出力を置く:

<ActionController::Parameters {"controller"=>"users", "action"=>"register"} permitted: false> 

登録フォーム

postData(){ 
    var myHeaders = new Headers(); 
    myHeaders.append('Accept', 'application/json') 
    myHeaders.append('Content-Type', 'application/json'); 

    var data = JSON.stringify({ 
     name: "Test", 
     email: "[email protected]", 
     password: "password" 
    }) 

    fetch("http://127.0.0.1:3000/register_user",{ 
     method: 'POST', 
     headers: myHeaders, 
     mode: 'no-cors', 
     body: data 
    }) 
    .then(function(res){ return res.json(); }) 
    .then(function(data){ alert(JSON.stringify(data)) }) 
    .catch((ex) => { 
     console.log("Fetch failed" + ex); 
    }); 
} 

JSONのパラメータラッピングがコンフィグレーションで有効になっています。 助けてくれてありがとう!

+1

'myHeaders.append( 'Content-Typeの'、 'アプリケーション/ JSON');'あなたのフロントエンドコードトリガーの一部あなたのブラウザはCORSプリフライトOPTIONSリクエストを送信します。 'mode: 'no-cors''を設定しても、ブラウザはそれをやり遂げることができません。したがって、 'http://127.0.0.1:3000/register_user'サーバがOPTIONSリクエストを処理し、それに応じて正しいCORSヘッダを返すように設定されていない場合、そのプリフライトは失敗し、ブラウザはそこで停止し、あなたのコードからPOSTリクエストを送信しようとしても。 – sideshowbarker

+0

ありがとう、私は私のラックを編集しました::レールを設定し、フロントエンドのモードにモードを変更しましたが、すべて正常に動作しません。 –

答えて

1

はOPTIONSを受け入れるようにラック:: CORSを設定する彼のコメントにsideshowbarkerのexplainendのような、トリックをしました。

application.rb

config.middleware.insert_before 0, Rack::Cors do 
    allow do 
    origins '*' 
    resource '*', :headers => :any, :methods => [:get, :post, :options] 
    end 
end 

とフロントエンドで

mode: 'cors' 
0

この場合のJSONパラメータにはシンボリックキーはありませんが、文字列のものはありません。代わりにこれを試してみてください:

@user = User.new(name: 'TEST', :email => params['email'], :password => params['password']) 
関連する問題