2011-01-22 9 views
0

ユーザーオブジェクトの配列をフラッシュからレール3に渡して、すべてを一度に更新しようとしています。ここで私が使用しているコードです。ここでレールを使ってユーザーを更新して配列する方法3

def update_by_fbid 
    if params[:users] 

    params[:users].each do |u| 
     puts u 
     user = User.find_by_fbid(u.fbid) 
     user.update_attributes(:first_name => u.first_name, :last_name => u.last_name) 
     end 
    end 
    render :json => {:updated_users => true} 
    end 

には、Flash

ここ
private function updateUsers(e:Event):void 
{ 
    var users:Array = [{fbid:"93847566", first_name:"Joe", last_name:"Blow"}, 
     {fbid:"7654321", first_name:"Ronda", last_name:"Smith"} 
     ]; 

    var vars : URLVariables = new URLVariables(); 
     vars.users = users; 

    var request : URLRequest = new URLRequest("http://localhost:3000/update"); 
    request.method = URLRequestMethod.POST; 
    request.data = vars; 

    var loader : URLLoader = new URLLoader(); 
    loader.addEventListener(Event.COMPLETE, registerHandler); 
    loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError); 
    loader.load(request); 
    } 

から私のコードで私は私は確信しているように、レールの新しい私はターミナルで

Started POST "/update" for 127.0.0.1 at Sat Jan 22 13:41:42 -0600 2011 
    Processing by UsersController#update_by_fbid as HTML 
    Parameters: {"users"=>"[object Object]"} 
Completed in 8ms 

NoMethodError (undefined method `fbid' for "[object Object]":String): 
    app/controllers/users_controller.rb:68:in `update_by_fbid' 
    app/controllers/users_controller.rb:66:in `each' 
    app/controllers/users_controller.rb:66:in `update_by_fbid' 

Rendered /Library/Ruby/Gems/1.8/gems/actionpack-3.0.2/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.1ms) 
Rendered /Library/Ruby/Gems/1.8/gems/actionpack-3.0.2/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (3.8ms) 
Rendered /Library/Ruby/Gems/1.8/gems/actionpack-3.0.2/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (8.9ms) 

を見ていますエラーがまだ少しあります私のオブジェクトをparmasから間違って選択するか、その性質のものを選択するだけです。誰かを願って私が物事のレールの面で間違っていることに私は少し学校をすることができます。

-m

答えて

1

@coreywardの言うことは間違いありません。しかし、私はエラーが早くも起こると思います。ログでは、私は、次を参照してください。

Parameters: {"users"=>"[object Object]"} 

とRailsは、オブジェクトが、ハッシュを期待していないので、

Parameters: {"users"=>"[{:first_name => 'Fred', last_name => 'Kruger'}, 
         {:first_name => "Harrison", :last_name => 'Ford'}]"} 

のようなものは今、私はあなたがフラッシュ/フレックスからこれを行うことができますかわかりません。 jsonに変換しますか? しかし、私はそれがあなたが探し始めるべきだと思います。

は、[EDIT:JSONを扱う]

ああ、私はあなたが今、本当にJSONを受けていることを、あなたの編集から見ることができます! Jsonは実際には特別な形式の文字列です。それでその仕事は、あなたがjson gemを(自分のGemfileに追加)を使用する必要があり、その後、あなたが何か書くことができます。

rcvd_users = JSON.parse(param[:users]) 
rcvd_users.each do |u| 
    user = User.find_by_fbid(u[:fbid])  
    puts u[:fbid] 
    unless user.nil? 
    user.update_attributes u 
    end 
end 

希望を、この私が@nathanvdaアドバイスを取った:)

+0

私はあなたのことを正しい道で考える。私はjsonを送信するためにフラッシュを取得するように変換しました。ここで何が起きるのですか?>>>私は以下にリストします。 – mattwallace

+0

これは明確でしたか? – nathanvda

0

あなたはそれのようなfbidにアクセスしているがparams[:user]内の項目のうちの一つの方法です。あなたが実際にしたいことはこれです:

params[:users].each do |u| 
    user = User.find_by_fbid(u[:fbid]) 
    user.update_attributes(:first_name => u[:first_name], :last_name => u[:last_name]) 
end 

あなたはfirst_namelast_name属性に大量の割り当てを防止していないと仮定すると、あなたはに何をやっている簡略化することができます。

params[:users].each do |u| 
    user = User.find_by_fbid u[:fbid] 
    user.update_attributes u 
end 

ちょうどそのことを確認してくださいは、fbidのような機密属性での質量の割り当てを防ぐためにを持っています。あなたは、この安全(ホワイトリスト)を行うには、モデルの上部にこれを追加することができます。

attr_accessible :first_name, :last_name 

あなたのソースであなたのインデントを再確認する必要があります。あなたの質問ではそれはちょっと怪しいです。混乱につながる可能性があります。endはそれに対応しています。

+0

ので、私は単純化し、私がHTML パラメータとしてがUserController#update_by_fbidにより、次のようなエラー処理を取得していますようだ:{「ユーザー」=>「[対象オブジェクト]」} は0ms NoMethodErrorに完成( Arrayのインスタンスが期待されている可能性があります。 nil.eachの評価中にエラーが発生しました: app/controllers/users_controller.rb:65: 'update_by_fbid 'の – mattwallace

+0

ええ、私はそれがnathanvdaが彼の答えで言っていたものだと思います。 Railsの有効なデータを供給していません。私は、それらのメソッドが期待していることや、あなたがクエリ文字列に持っている 'vars.users'配列をどのように改造するかについて、Flash/ActionScriptについて十分に知りません。 – coreyward

0

助け、およびJSONをFlashで送信しました。ここに私のコンソールが示していることがあります。

Started POST "/updatethem" for 127.0.0.1 at Sat Jan 22 20:11:51 -0600 2011 
    Processing by UsersController#update_by_fbid as HTML 
    Parameters: {"users"=>"[{\"first_name\":\"Joe\",\"last_name\":\"Blow\",\"fbid\":\"93847566\"},{\"first_name\":\"Ronda\",\"last_name\":\"Smith\",\"fbid\":\"7654321\"}]"} 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE ("users"."fbid" IS NULL) LIMIT 1 
Completed 200 OK in 13ms (Views: 2.4ms | ActiveRecord: 0.2ms) 

puts params[:users]を行うと、これは私がオーバー送りたいとユーザーの配列のように見えますが、次の操作を行うことは反復処理していないよう

[{"first_name":"Joe","last_name":"Blow","fbid":"93847566"},{"first_name":"Ronda","last_name":"Smith","fbid":"7654321"}] 

コンソルで私に次を与えませんアレイ。 Railsはparams [:users]が配列ではなく単一のオブジェクトとしてしか見えないようです。

params[:users].each do |u| 
    user = User.find_by_fbid(u[:fbid])  
    if user.nil? 
     puts u[:fbid] 
    else 
     user.update_attributes u 
     puts u[:fbid] 
    end 
end 
+0

実際には、質問を編集した方がより明確になります。とにかく、私はあなたが立ち往生しているところで私の答えを更新しました:jsonをどう扱うか。 – nathanvda

関連する問題