mailer作成 その14
メールのフィルター
複数のフィルターのORをとれるように修正。
たとえば、「Developer Works」のメールか、「あとで読む」のメールをリストビューに表示する。
view/filter/list.rhtml
各フィルターの先頭にチェックボックスを付加。そのためにテーブル開始の前に form_tag命令を、テーブルの終了の後にsubmit_tag命令とend_form命令を追加。form_tag命令のアクションメソッドの名前は、"set_filters"とした。また、各行の先頭にcheck_box命令を追加。check_box命令の第1引数は、"check_" + <id>、第2引数は、"check"とした。(7/26の日記を参照。)
controller/filter_controller.rb
ビューでフィルターを選択し、Submitボタンを押したときに呼ばれるFilterControllerのset_filtersメソッドの前半は以下の通り。
def set_filters filter_conds_a = Array.new params.each_key {|key| puts key if key =~ /^check_/ && params[key]["check"] == "1" id = key.sub("check_", "") filter = Filter.find(id) if filter != nil filter_conds_a << filter.conds end end }
チェックマークがつけられた行を選んで、キーからフィルターのidを取得する。取得したidからFilterオブジェクトを取り出し、検索条件を配列filter_conds_aにセーブする。そして後半は以下の通り。
n = filter_conds_a.size if n > 0 filter_conds = "(" i = 0 while i < n filter_conds += filter_conds_a[i] if i == n - 1 filter_conds += ")" else filter_conds += ") or (" end i += 1 end end if filter_conds != "" cookies[:filter_conds] = filter_conds end redirect_to("/list/list") end
取り出した条件式をORで接続し、構成した検索条件式をcookieでlistビューから参照できるように設定し、listビューを表示する。