2011-01-22 42 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 

下面是從閃存我的代碼

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) 

還是有點新的在軌我看到的錯誤,所以我敢肯定我只是不正​​確地從帕爾馬中選擇我的對象或者那種性質的東西。希望有人能夠在我的事業軌道方面對我做一些錯誤的學習。

-m

回答

1

@coreyward說的絕對正確。但我認爲這個錯誤發生得更早。在日誌中,我看到:

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

和Rails不希望的對象,但哈希值,所以像

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

現在,我不知道如何可以從Flash /柔性做到這一點。轉換爲json? 但我認爲這是你應該開始尋找的地方。

[編輯:處理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 

希望這有助於:)

+0

我覺得你在正確的軌道上。我已經轉換爲獲取Flash發送JSON,這裏是現在發生的事情>>>我將在下面列出。 – mattwallace 2011-01-23 02:13:19

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

所以簡化,並且似乎我被UsersController#update_by_fbid作爲HTML 參數得到以下錯誤處理:{「用戶」 =>「[對象的對象]」} 在0毫秒 NoMethodError完成(當你沒有想到它的時候,你有一個零對象! 你可能已經期望了一個Array的實例 評估nil.each時出錯: app/controllers/users_controller.rb:65:in`update_by_fbid' – mattwallace 2011-01-23 00:15:06

+0

是的,我認爲這就是nathanvda在他的回答中暗指的。您不會輸入Rails有效數據。我不太瞭解Flash/ActionScript,告訴你這些方法需要什麼,或者如何將你擁有的`vars.users`數組改寫爲查詢字符串。 – coreyward 2011-01-23 01:03:35

0

我把@nathanvda建議和和我現在已經通過JSON發送了Flash。這是我的consol現在顯示的內容。

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]確實給我的CONSOL

[{"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