RubyonRailsのform_tag備忘録

2009-05-22
このエントリーをはてなブックマークに追加

頻繁に使うくせに、いつまでたっても覚えられない。ついついコピペして使いまわしちゃうから「あれ、どうやって書くんだっけ」の繰り返しになってしまう。

これは、確認も含めて整理しておこう。

<% form_tag ({:controller => ‘コントローラ’, :action => ‘アクション’}, {:method => ‘post’, :multipart => true}) do %>
  <dl>
    <dt>入力してください。「テキストボックス」</dt>
    <dd><%= text_field_tag :hoge, nil, :style => ‘width:320px;’ %></dd>
    <dt>選択してください「ラジオボタン」</dt>
    <dd>
      <label><%= radio_button_tag :status, ‘0’, ‘checked’ %>非表示</label>&nbsp;|&nbsp;
      <label><%= radio_button_tag :status, ‘1’ %>表示</label>
    </dd>
    <dt>コメントしてください。「テキストエリア」</dt>
    <dd><%= text_area_tag :comment, nil, :style => ‘width:320px;height:120px;’ %></dd>
    <dt>ファイルをアップロードしてください「ファイル」</dt>
    <dd><%= file_field_tag :file_name %></dd>
  </dl>
<% end %>

methodはデフォルトでPOSTなので、特に指定する必要はありません。ファイルをアップロードしない場合は

<% form_tag :controller =>’コントローラ’, :action => ‘アクション’ do %>

でもOKです。text_field_tagの「:hoge」は要素名、「nil」は値。アクション側で受け取るときは

params[‘hoge’]

で受け取れます。

Railsであればform_forが猛烈に便利なのですが、すべてのフォームがモデルとイコールなわけではないので、やっぱりform_tagの出番も増えます。

設計が間違ってるのかなぁ。

RubyonRailsでファイルI/Oを走らせずにCSVを作成、圧縮してダウンロードさせる方法

2009-04-24
このエントリーをはてなブックマークに追加

長いタイトルですな。

つまり、サーバ上でファイルを作って圧縮、ダウンロードは結構簡単にできるんです。ただ、ファイル生成しちゃうとファイル名をユニークにしなきゃいけなかったり、ファイルのダウンロードが終わったら削除しなきゃいけなかったり、気分的に手間なんですよね。タイミングによってはダウンロードが開始される前に削除されちゃったりして、びっくりでした。

で、オンメモリでCSVファイル作って圧縮、ダウンロードまでしてみました。まぁメモリが安くなったからこそできる技ですよね。CSVが小さければいいけど、昔はこんなこと怖くてできなかった。

require ‘rubygems’
require ‘zipruby’

data = “a,b,crnA,B,C”
Zip::Archive.open_buffer(buffer, Zip::CREATE) do |arc|
  arc.add_buffer(“download.csv”,data)
end

send_data(buffer , :type=>’application/zip’, :filename => “download.zip”, :disposition=>’attached’)

オンメモリでCSVちゅーのはどうでもよくて、ポイントはZip::Archiveのadd_bufferでしょう。ziprubyのバージョンにもよりけりなのかもしれません。今回利用したのは0.2.9です。あとはsend_fileじゃなくてsend_dataを使うあたりですかね。

 

RubyでZIP圧縮、パスワードも設定する

2009-03-13
このエントリーをはてなブックマークに追加

RubyonRailsアプリケーションでサーバサイドでファイル圧縮、パスワードの設定をしてダウンロードさせる必要があったので調べてみました。

ZipRubyがあったりRubyZipがあったり、どっちがどうなんだか、相変わらずRubyは混乱します。今回は評判のよさそうなZipRubyを使いました。gemでインストールできて、バージョンは0.2.9でした。バージョン低いのがちと気になります。

gem install zipruby

これだけでインストールは終わりです。

require ‘rubygems’
require ‘zipruby’

Zip::Archive.open(‘hoge.zip’,Zip::CREATE) do |arc|
  arc.add_file(‘test.pdf’)
end

Zip::Archive.encrypt(‘hoge.zip’, ‘password’)

コレだけです。簡単すぎる。

複数ファイルをひとまとめにしたい場合は

arc.add_file(‘test.pdf’)

 

を繰り返せばOK。ただ、フォルダごとごっそり圧縮、という方法は不明。フォルダ名を引数に指定したら怒られてしまいました。当然の結果。

最後の行がパスワードの設定です。ZIPファイル作るときにパスワードを設定するのではなく、既存のZIPファイルに対してパスワードを設定する、というイメージですね。Lhaplusではちゃんと解凍できました。

RubyonRailsでのファイルのダウンロード

2009-02-10
このエントリーをはてなブックマークに追加

send_file(サーバ上のファイルパス, :type=>’application/pdf’, :filename => ダウンロード時に使用されるファイル名)

ファイルパスだけでもダウンロードは可能。その場合Content-typeはどうなるんだろう。application/octet-streamなのかなぁ。例によって確認してません。ファイル名も必須ではありません。

 

 

RubyonRailsでのselect_dateの使い方

2009-01-20
このエントリーをはてなブックマークに追加

何回書いても忘れてしまう。

view側

<%= select_date(Date.now, :use_month_numbers => true, :prefix => “from_date”) %>

Controller側

from_date = Date.parse(params[‘from_date’][‘year’] + “-” + params[‘from_date’][‘month’] + “-” + params[‘from_date’][‘day’])

これで日付型のfrom_dateに格納される。
ただ、不正な日付(2月31日等)はparseのタイミングでエラーが出るので、正確な日付かどうかのチェックは必要。

Date.valid_date?(params[‘from_date’][‘year’].to_i,params[‘from_date’][‘month’].to_i,params[‘from_date’][‘day’].to_i)

NGの場合はnilが返ってくる。

RubyonRailsでBackgrounDRbを使って定期イベント、非同期処理を行う

2009-01-06
このエントリーをはてなブックマークに追加

開発環境はWindows、本番環境はLinuxであったために悲しいことになった。Windows上ではforkが動かない(実装されていない)ので、BackgrounDRbを稼動させると怒られてしまう。まぁコーディングだけしてテストサーバにアップ、テストというちまちましたことを繰り返せば済む話なので我慢しましょう。

では、まずはインストールから。

gem install chronic packet
ruby script/plugin install http://svn.devjavu.com/backgroundrb/trunk
rake backgroundrb:setup

インストールはコレだけです。BackgrounDRbはgemじゃなくて、Railsプロジェクとに対してインストールするということですね。複数のプロジェクトがあったら、それごとにインストールします。この場合、インストールという表現は不適切なんでしょうね。

rakeを実行するとBackgrounDRb用のマイグレーションファイルができあがっています。ジョブのキューを保存しておくためのモノっぽいです。これを実行しておかないとBackgrounDRbを起動させたときに怒られます。怒られてばっかりですね。

ruby script/generate worker hoge

これでhogeというworkerができます。中に「create」っていうメソッドがありますが、コンストラクタですね。自分でメソッドを追加します。ここで嬉しいのがActiveRecordやActionMailerが使えることでしょうか。まぁ当然なのですが、非常にありがたいです。


:backgroundrb:
  :ip: localhost
  :port: 11006
:schedules:
  :hoge_worker:
    :hogehoge:
      :trigger_args: 0 * * * * * *

backgroundrb.ymlに上記のように書いておくと、毎分0秒にHogeWorderのhogehogeというメソッドを実行してくれます。インターバルはcrontabと同じ書き方ですが、「秒」と「年」が増えています。「年」って使うのかなぁ。。。オリンピックリマインダー?

コントローラなどから処理を投げたいときには

MiddleMan.new_worker(:worker => :hoge_worker, :method_name => :hogehoge)

と記述します。もちろん引数も渡せます。

 ちなみに、BackgrounDRbは事前に起動しておく必要があります。リスナーが別スレッドで待っていて、それに対して処理を投げるようなイメージでしょうか。若干メモリが不安です。

ruby script/backgroundrb start
ruby script/backgroundrb stop

これで起動と終了です。複数同時起動はしません。

インストールの仕方等々、バージョンによって違いがあるような気がします。細かいところで悩んだことが多かったです。備忘録を兼ねて、同じことで悩んでいる方の助けになればと思います。

Railsで子要素の値を検索条件に利用する

2008-12-30
このエントリーをはてなブックマークに追加

普通にconditionsで指定できたのかもしれませんが、ちと書き方がわからなかったのでjoinを利用しました。まぁfind_by_sqlを利用していないだけRailsっぽい(w)と思いましょう。

Foo.find(:all, :joins => “left join bar on foo.id = bar.foo_id”, :conditions => [“bar.column = ?”,value])

これで子要素(bar)のcolumnの値が「value」の親子(Foo、Bar)が取得できます。もっとうまいやり方があるのかもしれませんが、ハセテツはこういう書き方をしてます。

ハセテツがRubyonRailsを利用する理由

2008-12-30
このエントリーをはてなブックマークに追加
まぁそんなたいした理由もなく、プロジェクト立案、設計、開発、保守、とすべてを一人でまかなっている現状が結構キビしいものでして、効率よく開発できるRailsに飛びついただけです。

PHP、Smartyの組み合わせでも特に不満はなかったのですが、ActionPackが猛烈に魅力的でしたね。ActiveRecordは正直どうでもいいです。ORマッパーはあれば便利ですが、劇的に効率改善してくれてはいません。結局find_by_sqlもそれなりの頻度で使っています。

それでもこれまではVirtualHostが使えないという理由(もしかすると使えたのかも知れないが、ハセテツは知りませんでした)だけでパスしてました。1ホストに1アプリケーションなんて、贅沢な使い方はできませんでしたから。

そこへPassengerの存在を知ったのです。これがきっかけでした。「おぉ、Apacheのモジュールだ、Mongrelが不要になるんだ、VirtualHostが使えるんだ」

Rubyは習得も楽でした。ただ、perlの匂いがします。なんとなく。「他人が書いたRubyは読みたくない」っていうケースもあるかもしれませんね。Railsも、form_tagとform_forをきちんと使えるようになれば十分じゃないでしょうか。

現在開発中のWebアプリは、はじめてのRailsです。リファレンス片手に書いてます。それでも書きなれたPHPと同じくらいの進行ペースです。不慣れである分を補えるだけの効率のよさです。次のプロジェクトからは、もっと効率よく書けるでしょう。

今後が楽しみです。

RubyOnRailsで日本語メールを送信する

2008-11-25
このエントリーをはてなブックマークに追加

デフォルトはUTF-8のようです。UTF-8でもきちんと受信できるメーラーも多いですが、一番普及しているであろうMSOEが文字化けてしまうようなので、iso-2022-jpで送信する手法。もうUTF-8に統一しようよ。。。

今回はActionMaierとGetTextを利用。バージョンは以下。
Ruby 1.8.5
Rails 2.2.2
ActionMailer 2.2.2
GetText 1.93.0

まずはGetTextをインストール。これはgemで一発。

gem install gettext

メール送信するモデルは以下。ポイントはクラスの前にGetTextのインクルードと日本語であるという宣言。クラスの中で文字コードの宣言。これだけだとsubjectが残念な結果になったので、subjectは別途base64でエンコード。

require ‘gettext/rails’
GetText.locale = ‘ja’

class Hoge < ActionMailer::Base
  @@charset = ‘iso-2022-jp’

  def sendmail
    subject base64(‘ほげほげメール’)
    recipient 送り先
    from 送信者
    send_on 送信日時

  end

end

本文はerbファイルのテンプレート読み込みです。こっちに日本語が書かれています。送信はActionMailerでの通常の送り方のまま。これでGmail、Beckey!、MSOEでの受信には問題ありませんでした。

以前否定したRailsですが、最近多くの時間を割いています。理由は近いうちに説明、言い訳をしたいと思います。

RubyOnRailsを試してみた

2007-11-18
このエントリーをはてなブックマークに追加

「生産性をうん倍アップ」なんてよく聞いたのですが、ほんとにそこまであがるのかなぁ。

確かにテンプレートとか勝手に作ってくれて便利なのかもしれないけど、その分隠蔽化されちゃってる気がしてよけいに調べるのに時間がかかったりしてます。

 

慣れるとそのへんはあうんの呼吸で、手放せないくらい便利になっちゃったりするのかなぁ。

 

ただ、いろんなとこでパフォーマンスへの懸念は耳にしました。何はともあれ遅いらしい。もっさりレベルではなく、遅いらしい。RoRは処理速度は二の次、エンジニアが気持ちよくかけることを追求したらしいのですが、これだと運用入った瞬間に気持ちよくなくなるような気がする。。。

 

あと、個人的にORマッパーって嫌い。SQLって、書き方ひとつでパフォーマンスに影響出るじゃないですか。やっぱりSQLは自分の手でごりごり書きたいわけですよ。

 

古いんだろうなぁ、これが。

 

やはり、今にだPHP+Smarty+PostgreSQLが僕の中で最強です。PythonやRoRはもうちょっと様子見だな。。。