![](/img/trans.png)
[英]How do I get all the groups that have all the users I specified in an array in Rails/MongoId?
[英]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_name
和last_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.