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 %>" />