paramsの挙動

行番号の情報を付加する前に、その情報がどのようにparams[]へ渡って、どうしたら欲しい値を取得できるか、その仕組みを知っておく必要がある。以前もparamsを調べてみたが、未だ完全には理解できていない...。そこで、もう一度見直し。
もし、データベースと連携する入力フォームであれば、text_fieldなどのヘルパが利用できる。その場合は以下のような仕組みと理解した。

id = 1, file_name = '利益管理表'が保存されていると考えると...
@csv = Csv.find(params[:id])
基本
<%= text_field 'csv', 'file_name' %>
以下のように展開される
<input type="text" id="csv_file_name" name="csv[file_name]" value="<%= @csv.file_name %>" />

パラメーターは以下のようなハッシュで送信される。

{:csv => {:file_name => '利益管理表'} }

パラメーターのハッシュは以下のように取得できる。

params[:csv][:file_name]
オートインデックス
csv[]のように、オブジェクト名の後に[]を付加する。
<%= text_field 'csv[]', 'file_name' %>
以下のように展開される
<input type="text" id="csv_<%= @csv.id %>_file_name" name="csv[<%= @csv.id %>][file_name]" value="<%= @csv.file_name %>" />

パラメーターは以下のようなハッシュで送信される。

{:csv => { '1' => {:file_name => '利益管理表'} } }

パラメーターのハッシュは以下のように取得できる。

params[:csv][1][:file_name]

もし、複数のハッシュで返ってきた時は...

{:csv => {'1' => {:file_name => '200701利益管理表'}, '2' => {:file_name => '200702利益管理表'}}}

eachを利用すれば、以下のように扱うことが出来る。

params[:csv].each do |id, item|
  print "id=#{id.inspect}\n", "item=#{item.inspect}\n"
end
以下、実行結果
id="1"
item={:file_name => "200701利益管理表"}
id="2"
item={:file_name => "200702利益管理表"}
インデックスオプション
:index => を利用して任意のインデックスを付加することも出来る。
<%= text_field 'csv', 'file_name', :index => @csv.id %>
以下のように展開される
<input type="text" id="csv_<%= @csv.id %>_file_name" name="csv[<%= @csv.id %>][file_name]" value="<%= @csv.file_name %>" />
それでは、text_field_tagの時はどうすればインデックスを付加できるか?
オートインデックスや、インデックスオプションは利用できなかった...。
  • フィルター条件はデータベースには存在しないので、〜_tag系のヘルパーを使う必要があると考えた。
  • HTMLに展開された時の:name属性が、送信するパラメータの形式を決定すると考え、以下のようにやってしまった。
  • あまりスマートな方法には思えないが、これで良いのだろうか...。
<%= text_field_tag "csv_#{@csv.id}_file_name", @csv.file_name, :name => "csv[#{@csv.id}][filename]" %>
以下のように展開される
<input type="text" id="csv_<%= @csv.id %>_file_name" name="csv[<%= @csv.id %>][file_name]" value="<%= @csv.file_name %>" />