mailer作成 その10

最近加えて、記録していない変更をまとめておく。

ListController.showの変更

後半を下のように修正。

    if @type == 'multipart'
      @tmpdir = 'tmp/' + unique_id
      if FileTest.exists?("public/" + @tmpdir)
        # File.rename("public/" + @tmpdir, "public/" + @tmpdir + '.bkup')
        return
      end
      Dir.mkdir("public/" + @tmpdir)
      createMultipart
    else
      @tmpdir = 'tmp/' + unique_id
      if FileTest.exists?("public/" + @tmpdir)
        # File.rename("public/" + @tmpdir, "public/" + @tmpdir + '.bkup')
        return
      end
      Dir.mkdir("public/" + @tmpdir)
      createSingleHtml
    end

7月12日に書いたcreateSingleHtmlの呼び出し元。マルチパートでなかったら、createSingleHtmlを呼び出すように変更。ifのブロックとelseのブロックの前の6行は同じコードなので、ifの前に持っていける事にたった今気づいて修正。

createMultipartの修正

  def createMultipart
    n = 0
    for part in @parts
      type = part[:type]
      subtype = part[:subtype]
      filename = part[:filename]
      if filename != nil && filename != ""
        filename = "public/" + @tmpdir + '/' + filename
        body = part[:body]
        File.open(filename, "wb") {|fd|
          fd.write(body)
        }
      elsif type.upcase == "TEXT" && subtype.upcase == "HTML"
        filename = "public/" + @tmpdir + '/part_body_' + n.to_s + '.html'
        body = part[:body]
        File.open(filename, "wb") {|fd|
          fd.write(body)
        }
      elsif type.upcase == "TEXT"
        filename = "public/" + @tmpdir + '/part_body_' + n.to_s + '.html'
        body = part[:body]
        File.open(filename, "wb") {|fd|
          fd.write("<html><body><pre>\n")
          fd.write(body)
          fd.write("</pre></body></html>\n")
        }
      end
      n += 1
    end
  end

名前なしのtext/htmlパートとその他のtextパートに名前をつけて、テンポラリのフォルダ(といっても使い終わったら消すわけではないが)に保存して、それをビューから使うようにしている。これもよくみると、text/htmlのときにJISにコード変換していない(createSingleHtmlはしている)が大丈夫だろうか?これはとりあえず、そのままにしておく。

FilterController

DBに取り込んだメールは、仕分けするのも面倒なので、その代わりに「フィルター」でリスト表示の対象を制限するようにするつもり。そのためのコントローラー。といっても、scaffoldで作成したコードをこれからなんとかしていくつもり。とりあえず、クラス定義の先頭に

  before_filter :login_required

だけは入れてある。

ListController.set_filter

  def set_filter
    redirect_to('/filter/list')
  end

メール一覧を表示中に「フィルター」ボタンを押したとき、フィルター選択画面に遷移するようにした。(フィルター選択画面はもちろん未完成、というより未着手。)

Filter

フィルターのモデル。scaffoldで作成したが、現状、中身はなし。(ActiveRecord::Baseの単純なサブクラス。)対応するDB定義は、以下の通りのいい加減なもの。

create table filters (
  id        int not null auto_increment,
  name      varchar(64) not null,
  conds     text not null,
  primary key (id)
);

つまり、フィルターの名前とフィルターの条件文字列。この条件文字列をActiveRecord::Base.find()に渡して、取得するメールの一覧を制限するつもり。
フィルターのビュークラス群も、現状は、自動生成したのがあるだけ。