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 12
is でレンダリングされます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 を出力する必要がありますが、方法がわかりません。
どんな助けでも大歓迎です。ありがとう!