第24回 デザイナー向けプログラム部 #p4d に行ってきた

http://connpass.com/event/2748/

やったこと

前回の続き
何とかタルトラッカーのような、アレをもっと簡素化した、気軽にポイント管理ができる感じのタスク管理サービスをRailsで作ってて、それの続き。

TaskをIterationに条件付き has_many するのをやめて、task の status が変更された時だけIterationに紐付けることにした

/app/models/iteration.rb


has_many :tasks, :conditions => { :status => 'done' }
としていたのをやめて

has_many :tasks
だけにする

Iteration にデータをどうやって入れるか?

Iteration は以下の2カラムをもってる

  • start_date 毎週月曜日はじまり
  • end_date 毎週日曜日おわり

→どうやってデータを入れておくか? cronで毎月未来1ヶ月ぶんまで作るのがいいのではということになった。Heroku、cronお金かかるのかと思ってたらタダらしい。今回は間に合わなかったので次回以降に

今週の(今日を含む)Iterationを作ってみる

start_date は今日を含む週の最初の日
end_date は今日を含む週の最後の日
これが、こう書ける。


i = Iteration.new
i.start_date = Time.now.in_time_zone.beginning_of_week.to_date
i.end_date = Time.now.in_time_zone.end_of_week.to_date

今日doneになったTaskが紐づくIteration = 今週の始まりの日が start_date と 一致するIteration


Iteration.where(start_date: Time.now.in_time_zone.beginning_of_week.to_date).first

tasks#index に 今週の始まりの日がstart_dateと一致しているIterationをTaskに紐付ける @this_iteration メソッドを追加する

参考)
http://guides.rubyonrails.org/active_record_querying.html
2.3.1 Equality Conditions

app/controllers/tasks_controller.rb の def index に @this_iteration を追加


def index



@this_iteration = Iteration.where(start_date: Time.now.in_time_zone.beginning_of_week.to_date).first

task の status を 'doing' にするボタンにhidden_field で Iteration を紐付ける処理を追加する

app/view/tasks.html.haml


- if task.status == 'doing'
%span.status<>
= form_for(task) do |f|


= f.hidden_field :iteration_id, value: @this_iteration.id
= f.button "#{content_tag(:i, '', class: 'icon-ok-sign')}DONE".html_safe, type: :submit

doing 以外の status 変更ボタンには iteration を nil にリセットする処理を追加する


- if task.status == 'done'
%span.status<>
= form_for(task) do |f|


= f.hidden_field :iteration_id, value: nil
= f.button "#{content_tag(:i, '', class: 'icon-ok-sign')}DONE".html_safe, type: :submit

Routingにdone のアクションを追加する

参考)
http://guides.rubyonrails.org/routing.html
10.2 Adding More RESTful Actions

/photos/2/preview/ みたいな処理のときには 'member'


resources :photos do
member do
get 'preview'
end
end

/photos/search/ みたいな時は 'collection'


resources :photos do
collection do
get 'search'
end
end

今回の、this_iterationメソッドは前者に該当

config/routes.rb にこんな感じで追加する
'done' オブジェクトが新規に生成されるイメージなので post で


resources :tasks do
member do
post 'done'
end
end

で、done とかを メソッドにしちゃったほうがもっとカッコイイよということで

app/controllers/tasks_controller.rb に def done を追加


def done do
member do
post @this_iteration
end
end

とすると、done 以外の status 変更 もメソッド化する必要がある


def start do
member do
delete @this_iteration
end
end
とかやっとく。(ここでタイムアップ・・・次回につづく)
以下、他にも色々教わった。

コンソールにデータをリロード


reload!

タイムゾーンで日時をパースする


i.start_date = Time.zone.parse('2013-07-01')

データベースをリセットして作りなおす


rake db:reset
rake db:setup
rake db:migrate

データベースを全部表示


Iteration.all

Iterationの1件目を削除


Iteration.find(1).destroy

DBを直接見る


$ rails db
SQLite version 3.7.12 2012-04-03 19:43:07
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> SELECT "iterations".* FROM "iterations" WHERE "iterations"."start_date" = '2013-07-01' LIMIT 1;
sqlite> SELECT "iterations".* FROM "iterations" WHERE "iterations"."start_date" = '2013-07-01';
sqlite> SELECT "iterations".* FROM "iterations" ;
2|2013-07-01 00:00:00.000000|2013-07-07 23:59:59.999999|2013-07-04 11:30:13.748625|2013-07-04 11:30:13.748625

日付以外の時間とかもDBに入ってしまっていたので、日付だけに直す


i.start_date = i.start_date.to_date

例えば、Date.today のmethodsはこんな感じで確認することができる


Date.today.methods.grep /beginning/
=> [:beginning_of_day, :at_beginning_of_day, :beginning_of_week, :at_beginning_of_week, :beginning_of_month, :at_beginning_of_month, :beginning_of_quarter, :at_beginning_of_quarter, :beginning_of_year, :at_beginning_of_year]

Date.today.methods.grep /end/
=> [:end_of_day, :end_of_week, :at_end_of_week, :end_of_month, :at_end_of_month, :end_of_quarter, :at_end_of_quarter, :end_of_year, :at_end_of_year, :require_dependency, :load_dependency, :send, :public_send, :extend, :__send__]
なんか色々できる。クォーターとかもあるのかー。すごいなー。

Railsデバッグ方法


p @this_iteration
とか書いておくとログに this_iteration の中身が出る

puts "========================"
p @this_iteration
puts "========================"
とかやっておくとどこにデバッグ出てるか見やすくなって便利(ΦωΦ)

Routes の確認


$ rake routes
とやると

done_task POST /tasks/:id/done(.:format) tasks#done
tasks GET /tasks(.:format) tasks#index
POST /tasks(.:format) tasks#create
new_task GET /tasks/new(.:format) tasks#new
edit_task GET /tasks/:id/edit(.:format) tasks#edit
task GET /tasks/:id(.:format) tasks#show
PUT /tasks/:id(.:format) tasks#update
DELETE /tasks/:id(.:format) tasks#destroy
root / tasks#index
これが見れる

感想

  • またもや、@satococoaさんにすごくわかりやすく教えていただき、ありがとうございました。また教えてもらうだけになってしまった。。また@satococoaさんが何かを作る時にはお手伝いしなければならない感じある(ΦωΦ)
  • 色々教えていただいたけど、Blogに書こうと思ってひと通り復習したら結構忘れてたりあやふやだったりして調べなおしたり考えなおしたり。。とりあえずざっくりでもBlogに書くのは有効だ。こんなの誰が見ても役に立たないかもしれないが、少なくとも自分にとっては書くだけで役に立つのだ。
  • ソースがひと通りGitHubに挙げてあるので、教えて下さる方の@satococoaさんもご自分のMacにcloneして、手元のものを見ながら、色々素振りなどをしながら教えていただくことができた。あの方法は良い。
  • 教えていただく際に、@satococoaさんにサービス使ってもらったら、UIのわかりづらい場所がわかったのでこう直したらもっと良いというアイデアを思いついた。人に使ってもらうのは良いな。
  • いつもForkwellの方にしか行ってなかったが、初めて万葉さんの方におじゃました。一度行ってみたいと思ってて、やっとおじゃますることができたヾ(*'ω'*)ノ゙
  • ちょうど @a_matsuda さんが @machida さんに会いたがってた(何かを頼みたがってた)ので、飛び入りでお連れした。P4Dに@a_matsudaさんがいる絵はなんか新鮮でよい。
  • 連れて行っていただいた中華屋さんが美味しかった。杏仁豆腐がうまい。そしてみんなずっとファミコンの話してた。
  • そんなわけで、やっぱりRailsは楽しい…のだが、やっぱりたまりにたまったタスクを片付けるまで or 次回のP4Dまで封印しておこう・・・(ΦωΦ)