rails

2009年8月 7日 (金)

Railsで掲示板を作成

Railsの案件を受注する条件として一晩でRailsで掲示板を作ってくれと言われた。
夜の7時ぐらいに連絡があり、朝の9時10時には、仕上げてほしいと、かなりの無茶振り。
でも、せっかくなので、作ってみた。
Commentboard

12時まで、デザインで悩む。
いろいろなサイトを参考にして、上記のデザインに決定。
Rspecのテストファーストで開発をする。はっきりいって、使い捨てのシステムにテストファースト開発する意味など無かった。
ただ、癖にしとかないと、ついつい言い訳をしてテストファーストをしない体質になるのが怖かったので、時間が掛かるのを承知でテストファーストにした。

案の定、Rspec_on_railsのpostメソッドの使い方が解からず2時間ほどはまった。
モデルのフィールド、たとえばcommentモデルのbodyフィールドの場合、ブラウザからサーバに渡す形式ってcomment[body]=???の形で渡るので、同じようにpost(create,'comment[body]'=>'??? ')としてみても、サーバー側でparams[:comment]は空。試行錯誤のうち、post(create,:comment=>{:body=>'??? '})が正しいことが判明。この時点で4時近くになっていた。
コメントの投稿と閲覧ができるまでの実装は順調に進み、6時に終わった。

ただ、その時点の状態では、コメントは無限に投稿できるし、コメントの表示も今まで投稿された全部が一画面に表示される状態だった。
これだと本当に最低限すぎて実用性がまったくないのはいやだなーと思い、掲示板作成機能を追加することを画策。
そうなるとBoardモデルが必要になり、いままでのCommentモデルにBoadモデルのリファレンスを追加し、また、掲示板作成画面もどうすんのよ。って話になり、さらには、作成機能があったとしても、掲示板一覧を表示する画面も必要になるよね、やっぱり2chのように1掲示板の投稿を1000件ぐらいに制限する必要もあるよねということで、明らかに残り3時間では無理だと判明。

次に考えたのがページネーション機能。前のエントリにもあったようにJavaScriptでできるフレームワークがあるって思っても、無限に投稿されていくと日々重くなっていくのは、明らか。
素直にページを変える度にサーバにアクセスしてもいいのだが、それだとJavaScriptのフレームワークの大部分を改造する必要がある。ページングするには、全レコード数がでないといけないから、Model.find(:all).sizeみたいなこともしないといけないし、それって軽いんだっけと悩む。select_sqlだと速いのかなー。

どれも制限時間内に無理だと気づいたら、7:30を回っていて、あーこれは最低限の機能のソースを渡すしかないなと思っていたら、なにもこっちでデータをどう絞るか考えなくても、ユーザに選択させればいいじゃんと思いついた。
そこで、自分の作った家計簿の日付選択のライブラリがあることに思いあたり、思いのほか簡単に取り込めた。サーバー側も渡された日付をパースして、find時のconditionに渡すだけ。

すべて完了したのが9時過ぎ。あっという間だけど、永かった。
画面も一画面、モデル、コントローラも1個とかなりしょぼいが、一応実用できるとこまではいったんじゃないかなと思っている。

一応最近得意のgithubに挙げました。
http://github.com/takeshy/commentboard/tree/master

これで面接落ちたら、ショックでかそう。

| | コメント (0) | トラックバック (0)

2009年5月14日 (木)

undefined method use_transactional_fixtures=

仕事上の関係でrailsのversionを2.1から2.3で作りなおすことになった。
2.3用にgem install rspec rspec-railsで最新のrspecをinstallし、正しく
動作することを確認したのだが、逆にrails 2.1のrspecが
undefined method use_transactional_fixtures=
で動作しなくなってしまった。
rails 2.1にはrspec 1.1.8のバージョンが必要だからだ。

gem "rspec","= 1.1.8"

と指定してみたのだが、

can't activate rspec(= 1.1.8), already activated rspec-1.2.6

のエラーが出力される。

対応として下記の記述をRakefileの先頭と、spec/spec_helper.rbに記述することで
実行できるようになった。

gem "rspec","= 1.1.8"
$:.unshift File.expand_path(File.dirname(__FILE__) + "/vendor/plugins/rspec-rails/lib")
$:.unshift File.expand_path(File.dirname(__FILE__) + "/vendor/plugins/rspec-rails/bin")

| | コメント (0) | トラックバック (0)

2009年4月29日 (水)

windowsでselenium on railsがinvalid args ./C:/applicationのエラー

そもそもwindowsでrender :file=>フルパス指定が必ずエラーになってしまう。
rails2.3で導入されたfind_templateのバグっぽい。
:file指定による絶対パス指定なのに、./C:/といった感じに先頭に./をつけられてしまう。
仕方ないので一時的にパスの先頭がドライブ文字だった場合は./をつけないように
下記のように仮対応。自己責任でお願いします。

1.8/gems/actionpack-2.3.2/lib/action_view/template.rb
112行目 
@load_path, @filename = load_path, File.join(load_path, template_path)
        ↓
@load_path, @filename = load_path, template_path =~ /\A[a-zA-Z]:/ ? template_path : File.join(load_path, template_path)

追記 git hubの2.3.2のstableでは直っていました。 調子にのってticket発行したら、もう直っているよと言われ、 恥ずかしいです。 ticket を発行する前に

% cd <RAILS_ROOT>/vendor
% git clone git://github.com/rails/rails.git
をしろってことですね。

| | コメント (0) | トラックバック (0)

2009年4月25日 (土)

LIBMYSQL.dll が見つかりません

仕事でwindowsにRails2.3をインストールする手順書を作成。
Rails 2.3はruby 1.8.7が推奨のため、rubyやrubygemを単体で
インストールしていかないといけない。
MySQLのインストール関連で2回はまった。
まず一つ目はMySQL のバージョン5.1をインストールすると、
rake migrationの際にeachメソッドが見つからないというエラーになる。
設定ファイルを見ると、railsはMySQL5.1は未対応みたいなことが
書かれてあったため、一度アンインストールして、MySQL5.0を再度
インストール。
MySQL5.0では、rake db:create'でいきなりLIBMYSQL.dll が見つかりません
のエラー。
ネットで調べると、環境変数PATHにMySQLのbinへのパスが通っていないと起きる
そうだが、インストールの際にWindows OptionでPATHに追加する指定にチェックを
入れ、実際にPATHを見ると正しくセットされているのに…。

と思ったら、MySQLインストールしてから再起動していなかった。orz
そのため、追加されたPATHが認識されておらず、再起動により、無事
rake db:createができるようになった。

| | コメント (0) | トラックバック (0)

2008年2月 7日 (木)

Railsで簡易カレンダ

今、体重管理のためのWebアプリをRailsの勉強をかねて、作ろうとしている。
カレンダにその日の体重を表示できるようにしたいのだが、 Rails カレンダでgoogle先生に質問したが、よく解らない回答 だったので、自分で作ってみた。

無保証です。使用により不都合が起きても責任を取りません。

コントローラ側

def list_cal
    if params[:date]
      begin
        indicate = params[:date].split("-")
        session[:date] = Date.new(indicate[0].to_i,indicate[1].to_i,indicate[2].to_i)
      rescue
        flash[:notice] = "Invalid #{params[:date]}"
      end
    end
    unless session[:date]
      session[:date] = Date.today
    end
    @date = session[:date]
  end
end

list_cal.html.erb

<%= link_to('先月',:action=>'list_cal',:date=> @date.last_month) -%>
<span><%= @date.year %><%= @date.month%></span>
<%= link_to('来月',:action=>'list_cal',:date=>@date.next_month) -%>
<table>
  <thead>
    <tr>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
    <% cnt = 0 -%>
    <% @date.beginning_of_month.beginning_of_week.yesterday.upto
(@date.end_of_month.next_week(:monday).yesterday.yesterday) do |d| -%>
      <% if cnt != 0 && cnt % 7 == 0 -%>
      </tr>
      <tr>
      <% end -%>
      <td> <%=d.day-%> </td>
      <% cnt+=1 -%>
      <% end -%>
    </tr>
  </tbody>
</table>

現時点ではCSSまったくつけていないが、これから土、日の色を変えたり等を

行う予定。

さらに祝日もhttp://www.h3.dion.ne.jp/~sakatsu/holiday_logic4.htm#Ruby を利用させていただいて、表示できるようにする。

日付はリンクにして、その日の体重等を書き込む入力画面に遷移する予定。

今週の土曜日が解らなかったので、来週の月曜日の昨日、昨日にしているのが、 かなりダサい。

イメージ  2008年4月

30 31 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 1 2 3

| | コメント (0) | トラックバック (0)