Rails 5:如何发送多条记录的发布请求

时间:2016-12-15 20:50:52

标签: ruby-on-rails json ruby post ruby-on-rails-5

这就是我想要做的事情:

= form_tag(path) do
    - @items.each do |i|
        = fields_for "i[]", i do
            %input.content{:name => "content", :type => "hidden"}
    = submit_tag "Submit"

如您所见,我尝试将.content的所有items输入值传递给路径。

这些是我得到的参数:

{"utf8"=>"✓", "content"=>"", "commit"=>"Submit"}

我期待这样的事情:

{"items": [
    {
        "id":1,
        "content":""
    },
    {
        "id":2,
        "content":""
    },
    {
        "id":3,
        "content":""
    },
] }

如何在rails中创建这些POST请求?

1 个答案:

答案 0 :(得分:0)

这比你试图做到的更简单。如果每个嵌套模型都有一组字段,则往往只需要fields_for。在这里你只有一个隐藏的列,所以我选择只使用一个隐藏的字段,例如:

= form_tag(path) do |f|
    - @items.each do |i|
      = f.hidden_field "items[#{i.id}]", value: i.content
    = submit_tag "Submit"

注意:不要将错误测试作为练习留给读者。

这将生成一组参数,用于映射项目的ID与内容的对比,例如:"items"=>{"38383285"=>"", "304713261"=>"Some content here", "547539357"=>"Some other content here"}

您可以通过迭代来改变您喜欢的实际值。

您没有提供模型实际结构的任何示例 - 因此我猜测您将如何使用它...您需要(可能大量)修改下面的示例以满足您的实际需求。 一方面 - 鉴于它是一个隐藏的领域 - 我不知道你试图更新的是什么其他模型(和列)。因此,假设您有第二个名为OtherItem的模型,该模型还有一个内容字段,并通过Item列映射到item_id。在这种情况下,你可以这样做:

def my_action
  item_ids = params[:items].keys
  items = OtherItem.where(:item_id => item_ids)
  items.each do |item|
    item.update(content: params[:items][item.item_id])
  end
  # other stuff here