簡體   English   中英

我如何使用Rails 3更新和排列用戶

[英]how do I update and array of users with rails 3

我正在嘗試將一組用戶對象從Flash傳遞到rails 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)

在rails上還是一個新手,所以我確定我只是從Parma中錯誤地選擇了我的對象或類似的東西。 希望有人可以讓我對我在事情方面的錯誤做一些了解。

-米

@coreyward所說的絕對正確。 但是我認為錯誤甚至更早發生。 在日志中,我看到:

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

Rails並不期望對象,而是哈希,所以類似

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

現在,我不確定如何從flash / flex中做到這一點。 轉換成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

希望這可以幫助 :)

您正在訪問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對應於什么。

我接受了@nathanvda的建議,現在我讓Flash通過JSON發送。 這是我的控制台現在顯示的內容。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM