【问题标题】:Editing multiple records at once - how to update without IDs一次编辑多条记录 - 如何在没有 ID 的情况下更新
【发布时间】:2013-02-17 21:24:00
【问题描述】:

Rails 还是新手。我会尽量提供尽可能详细的信息。

我有一个表单可以让我一次更新多条记录。
它基于'Editing Multiple Individually' Railscast episode

<%= form_tag(auction_clerk_path(@auction), :method => :put) do %>
  <% @lots.each do |lot| %>
    <%= fields_for "lots[]", lot do |f| %>
      <%= f.number_field :sale_price %>
    <% end %>
  <% end %>
<% end %>

(简化为每个实例只包含一个输入)

拍卖包含多个Lots(待售物品)。
auction_clerk_path 是我用来在一次拍卖中展示所有拍品的路线。

一切正常...直到我尝试自定义我的批次路径...

我已将以下内容添加到我的 lot.rb 文件中以便能够使用:
/auctions/:auction_id/lots/:lot_number
而不是/auctions/:auction_id/lots/:id

def to_param
  lot_number
end

因此,在前面提到的表单中,字段以name="lots[12][sale_price]" 呈现,其中12id

但是随着 to_param 的更改,现在字段以 name="lots[1][sale_price]" 呈现,其中 1 是 lot_number

当我保存时,提交的参数是lot_numbers而不是ids。
所以很明显,当它尝试更新时,它不会找到正确的记录。

我的方法定义如下:

def save_clerking
  @updated_lots = Lot.update(params[:lots].keys, params[:lots].values).reject { |l| l.errors.empty? }
  if @updated_lots.empty?
    flash[:notice] = "Lots updated"
    redirect_to auction_clerk_path(@auction)
  else
    render :action => "clerk"
  end
end

我要么需要将我的方法定义更改为按批号查找,要么将表单更改为首先以某种方式输出 ID...但我不知道如何。

感谢任何帮助。谢谢!

【问题讨论】:

    标签: ruby-on-rails-3


    【解决方案1】:

    通过对另一个问题的帮助解决了这个问题。

    我将方法 def 更改为

    @updated_lots = []
    params[:lots].each do |lot_number, attributes|
      lot = Lot.where("lot_number = ? AND auction_id = ?", lot_number, params[:auction_id]).first
      if lot.update_attributes(attributes)
        @updated_lots << lot
      end
    end
    

    【讨论】:

      【解决方案2】:

      您可以在控制器操作中按批号获取 id,并将它们提供给 update 方法而不是 params 键。

      【讨论】:

        猜你喜欢
        • 2019-08-19
        • 1970-01-01
        • 1970-01-01
        • 2016-08-13
        • 2020-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-12
        相关资源
        最近更新 更多