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()に渡して、取得するメールの一覧を制限するつもり。
フィルターのビュークラス群も、現状は、自動生成したのがあるだけ。