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ビューを表示する。