1

Railsはまだ初心者です。できるだけ詳細を提供するように努めます。

一度に複数のレコードを更新できるフォームがあります。これは、 Railscast のエピソード「Editing Multiple Individually」
に基づいています。

<%= 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 %>

(インスタンスごとに 1 つの入力を含めるように単純化されています)

オークションには複数のロット(販売アイテム)が含まれます。
これauction_clerk_pathは、1 つのオークションですべてのロットを表示するために使用しているルートです。

すべてが正常に機能しています...ロットパスをカスタマイズしようとするまで...

使用できるように、 lot.rbファイルに次を追加しました
/auctions/:auction_id/lots/:lot_number
/auctions/:auction_id/lots/:id

def to_param
  lot_number
end

したがって、前述のフォームでは、フィールドはname="lots[12][sale_price]"where 12is でレンダリングされますid

ただし、to_param変更により、フィールドname="lots[1][sale_price]"は 1 が でレンダリングされるようになりましたlot_number

保存すると、送信されたパラメーターは ID ではなくロット番号です。
したがって、明らかに更新しようとすると、正しいレコードが見つかりません。

私のメソッド定義は次のようになります。

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 を出力する必要がありますが、方法がわかりません。

どんな助けでも大歓迎です。ありがとう!

4

2 に答える 2

0

別の質問のヘルプを通じてこれを修正しました。

メソッドの定義を次のように変更しました

@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
于 2013-02-18T16:59:34.020 に答える