我想使用jquery ajax调用在rails应用程序中创建人物对象。一次调用一个对象创建就好了。我想要的是传递一组名字并在一次旅行中创建多个对象。
有什么想法吗?
由于
答案 0 :(得分:3)
这有两个阶段:第一个是非ajax相关的,基本上是“我应该如何做一个控制器动作来一次创建/更新多个对象”。自从铁轨发明以来,这一直是一个常见的问题,人们已经以各种方式处理它(google“rails multiple update”)。一旦你有了这个控制器动作,你就可以从普通形式或者ajax请求中调用它,它实际上并不是特别的。
因此,我们只需要一个控制器动作来获取一些名称并使用户。我会使它变得灵活,并且使数据保存在params [:users]中的数组中,数组中的每个条目都是参数的散列(就像常规创建/更新中的params [:user]一样调用)
#needs to be added to your routes as a :post action
def multiple_create
@users = []
@failed = []
params[:users].each do |user_hash|
user = User.new(user_hash)
if user.save
@users << user
else
@failed << user
end
end
end
现在,这将使params有这种形式(例如,如果您通过名称发送):
params: {:users => [{:name => "Alice"}, {:name => "Bob"}]}
现在您只需要相应地调整ajax查询中的数据。我不知道数据来自哪里,因为你在问题中没有提供页面的详细信息,但它可能是这样的(让我们假设有一堆输入的名称都有“newUserName”类) :
//build the array
var users = new Array();
$(".newUserName").each(function(){
var user = {"name": $(this).val()};
users.push(user);
});
//make the request
jQuery.ajax({
async:true,
type: "POST",
url: ("/users/multiple_create/"),
data: {"users": users},
dataType: "script"
});
虽然,我刚测试了这个,而用户中的javascript对象看起来像这样:
[{name:"alice "}, {name:"bob "}, {name:"charlie"}]
,它实际发送的params看起来像这样:
{"users"=>{"0"=>{"name"=>"alice "}, "1"=>{"name"=>"bob "}, "2"=>{"name"=>"charlie"}}}
因此,看起来jquery不希望将数组作为参数发送,而是将其转换为散列,使用0,1,2等形式的唯一键来区分不同的散列。无论如何,这是建立params的更好方法,因为它使得它们不太容易以常规形式混合在一起。我们可以通过修改控制器动作来解决这个问题:
if params[:users].is_a?(Hash)
@user_hashes = params[:users].values
else
@user_hashes = params[:users]
end
@user_hashes.each do |user_hash|
...
答案 1 :(得分:0)
我不熟悉ruby-on-rails,但是这样怎么样?
循环遍历数组并创建键值对。关键是让我们说“名称” - 由索引扩展 - 值是人名。确保使用post方法发送数据,这样就可以获得足够的空间来发送大量名称。 在服务器端,通过使用循环读取所有参数并创建对象。