Hatena::Grouprubyist

うんたらかんたらRuby RSSフィード

2010-06-01git on rails

git on rails

| git on rails - うんたらかんたらRuby を含むブックマーク はてなブックマーク - git on rails - うんたらかんたらRuby

Railscasts - Git on Rails

知らんかった。こうすればよかったんか。


touch tmp/.gitignore log/.gitignore

ってやって空ファイルを作成しておいた上で

root下の.gitignoreに下記のように書いておけばok。

# .gitignore
.DS_Store
log/*.log
tmp/**/*
config/database.yml
db/*.sqlite3


これまでは、各ディレクトリ(tmp、log)の下の.gitignoreにそれぞれ

その配下で不要なファイルを追記していた。

こんな感じで。

$ git init
$ echo '*.log' > log/.gitignore
$ echo '*
> !.gitignore' > tmp/.gitignore
$ git add .
$ git commit -m 'initial'

これ、嫌だなぁと思ってたんだよ。

railscastsの方が.gitignoreの見通しが良くなるので、早速使おう。

追記

vendor/.gitignore は無い方がいいんじゃないかと思ったので削除

トラックバック - http://rubyist.g.hatena.ne.jp/rochefort/20100601

2010-05-30cucumber事始め(2)

cucumber事始め(2)

| cucumber事始め(2) - うんたらかんたらRuby を含むブックマーク はてなブックマーク - cucumber事始め(2) - うんたらかんたらRuby

前回の続き。

cucumber事始め - うんたらかんたらRuby - Rubyist



railscasts

railscastsの

2つのシナリオ(一覧表示を追加、新規追加を修正)を日本語で書くとこうなる。

Railscasts - Beginning with Cucumber



修正前

#features/manage_articles.feature
Feature: Manage articles
  管理者は、ブログの記事を管理できる
  
  Scenario: 記事を登録する
    Given "新規記事"ページを表示している
    When  "タイトル""タイトル 1"と入力する
    And   "コンテンツ""コンテンツ 1"と入力する
    And   "送信"ボタンをクリックする
    Then  "タイトル 1"と表示されていること
    And   "コンテンツ 1"と表示されていること

  Scenario: 記事を削除する
    Given 以下の記事を作成する:
      |title|content|
      |タイトル 1|コンテンツ 1|
      |タイトル 2|コンテンツ 2|
      |タイトル 3|コンテンツ 3|
      |タイトル 4|コンテンツ 4|
    When 3番目の記事を削除する
    Then 以下の記事を表示していること:
      |Title|Content|
      |タイトル 1|コンテンツ 1|
      |タイトル 2|コンテンツ 2|
      |タイトル 4|コンテンツ 4|

#step_definitions/article_steps.rb
Given /^以下の記事を作成する:$/ do |articles|
  Article.create!(articles.hashes)
end

When /^(\d+)番目の記事を削除する$/ do |pos|
  visit articles_path
  within("table tr:nth-child(#{pos.to_i+1})") do
    click_link "削除"
  end
end

Then /^以下の記事を表示していること:$/ do |expected_articles_table|
  expected_articles_table.diff!(tableish('table tr', 'td,th'))
end

修正後

#features/manage_articles.feature
Feature: Manage articles
  管理者は、ブログの記事を管理できる

  Scenario: 記事一覧を参照する
    Given 以下の記事を作成する:
    |title|content|
    |ピッツァ   |コンテンツ 1|
    |フランスパン |コンテンツ 2|
    When  "記事一覧"ページを表示する
    Then  "ピッツァ"と表示されていること
    And   "フランスパン"と表示されていること
  
  
  Scenario: 記事を登録する
    Given 記事を全て削除する
    And   "記事一覧"ページを表示している
    When  "新規記事"ページを表示する
    And   "タイトル""ジャガイモ"と入力する
    And   "コンテンツ""美味しいジャガイモ料理"と入力する
    And   "送信"ボタンをクリックする
    Then  "記事作成が正常に行われました"と表示されていること
    And   "ジャガイモ"と表示されていること
    And   "美味しいジャガイモ料理"と表示されていること
    And   記事の件数は1件となる

  Scenario: 記事を削除する
    Given 以下の記事を作成する:
      |title|content|
      |タイトル 1|コンテンツ 1|
      |タイトル 2|コンテンツ 2|
      |タイトル 3|コンテンツ 3|
      |タイトル 4|コンテンツ 4|
    When 3番目の記事を削除する
    Then 以下の記事を表示していること:
      |Title|Content|
      |タイトル 1|コンテンツ 1|
      |タイトル 2|コンテンツ 2|
      |タイトル 4|コンテンツ 4|


#step_definitions/article_steps.rb
Given /^以下の記事を作成する:$/ do |articles|
  Article.create!(articles.hashes)
end

When /^(\d+)番目の記事を削除する$/ do |pos|
  visit articles_path
  within("table tr:nth-child(#{pos.to_i+1})") do
    click_link "削除"
  end
end

Then /^以下の記事を表示していること:$/ do |expected_articles_table|
  expected_articles_table.diff!(tableish('table tr', 'td,th'))
end

Given /^記事を全て削除する$/ do
  Article.delete_all
end

Then /^記事の件数は(\d+)件となる$/ do |count|
  Article.count.should == count.to_i
end
トラックバック - http://rubyist.g.hatena.ne.jp/rochefort/20100530

2010-03-17habtmとhas_many throw

habtmとhas_many throw

| habtmとhas_many throw - うんたらかんたらRuby を含むブックマーク はてなブックマーク - habtmとhas_many throw - うんたらかんたらRuby

Railscasts - Two Many-to-Many

より


どっち選択すりゃいいの?

ってなったときは

1.do I need to store extra information in the join?

2.do I need to treat the join like its own model?

if you answer "yes" to any of these, you need a has_many :throw association.

Otherwise you "might" want to use has_and_belongs_to_many.

1.join時に他の情報も格納したいか?

2.join時に自分自身のモデルとして扱いたいか?

どちらかyesなら→has_many_thorow

noなら→habtm


参考

Rails(ActiveRecord)の多対多関連 - yuum3のお仕事日記

トラックバック - http://rubyist.g.hatena.ne.jp/rochefort/20100317

2010-03-16urlのidについて

urlのidについて

| urlのidについて - うんたらかんたらRuby を含むブックマーク はてなブックマーク - urlのidについて - うんたらかんたらRuby

Railscasts - Model Name in URL

より


railsurlは通常「model/id」ってなってると思う。

このidは変更可能なんですって。

知らんかった。


railscastsのurlもこの方式でやってるんだ。

http://railscasts.com/episodes/63-model-name-in-url


やりかた

to_paramをoverrideするだけ。

# product.rb
def to_param
  "#{id}-#{permalink}"
end

# controller
@product = Product.find(params[:id])

id以外でやる場合は

# product.rb
def to_param
  permalink
end

# controller
@product = Product.find_by_permalink(params[:id])

やってみた

f:id:rochefort:20100317010624p:image


追記

ちょっとうれしい。

f:id:rochefort:20100317010625p:image


画像をアップロードするのがhatenaグループからだと

今日の一枚しかアップロードできなくなってる。

ん〜、rubyistさびれまくってるし、移転考えようかな。

トラックバック - http://rubyist.g.hatena.ne.jp/rochefort/20100316

2010-03-10Logger!!! (ログにタイムスタンプを追加する方法)

Logger!!!(ログにタイムスタンプを追加する方法)

| Logger!!!(ログにタイムスタンプを追加する方法) - うんたらかんたらRuby を含むブックマーク はてなブックマーク - Logger!!!(ログにタイムスタンプを追加する方法) - うんたらかんたらRuby

Railscasts - The Logger

Logger!!! - うんたらかんたらRuby - Rubyist


ログに日時を追加(簡易版)

/opt/local/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/core_ext/logger.rb

コメントに日付フォーマットのみ変更してタイムスタンプを表示する方法が書いてた。

 20 # Extensions to the built in Ruby logger.
 21 #
 22 # If you want to use the default log formatter as defined in the Ruby core, then you
 23 # will need to set the formatter for the logger as in:
 24 #
 25 #   logger.formatter = Formatter.new
 26 #
 27 # You can then specify the datetime format, for example:
 28 #
 29 #   logger.datetime_format = "%Y-%m-%d"
 30 #
 31 # Note: This logger is deprecated in favor of ActiveSupport::BufferedLogger
 32 class Logger

とりあえずミリ秒まで不要であれば、これだけでいけました。

(Loggerのoverride不要)

# environment.rb
  config.logger = Logger.new(config.log_path) 
  config.logger.formatter = Logger::Formatter.new
  config.logger.datetime_format = "%Y-%m-%d %H:%M:%S"
D, [2010-03-08 03:07:33#5394] DEBUG -- :   Memo Load (1.2ms)   SELECT * FROM "memos" LIMIT 10 OFFSET 0
I, [2010-03-08 03:07:33#5394]  INFO -- : Rendering template within layouts/application
I, [2010-03-08 03:07:33#5394]  INFO -- : Rendering memos/index
D, [2010-03-08 03:07:33#5394] DEBUG -- : Rendered memos/_sidebar (0.7ms)
I, [2010-03-08 03:07:33#5394]  INFO -- : Completed in 147ms (View: 140, DB: 1) | 200 OK [http://localhost/memos]


以下、試行錯誤及び、もっとカスタマイズしたい場合の書き方。


Logger::Formatterを追加

apiを見てみると、Formatterというクラスがあるらしい。

早速追加。

# environment.rb
  config.logger = Logger.new(config.log_path) 
  config.logger.formatter = Logger::Formatter.new

Processing MemosController#index (for 127.0.0.1 at 2010-03-08 01:00:46) [GET]
D, [2010-03-08T01:00:46.375185 #74468] DEBUG -- :   Memo Load (0.6ms)   SELECT * FROM "memos" LIMIT 10 OFFSET 0
I, [2010-03-08T01:00:46.376684 #74468]  INFO -- : Rendering template within layouts/application
I, [2010-03-08T01:00:46.376992 #74468]  INFO -- : Rendering memos/index
D, [2010-03-08T01:00:46.393688 #74468] DEBUG -- : Rendered memos/_sidebar (0.1ms)
I, [2010-03-08T01:00:46.394937 #74468]  INFO -- : Completed in 25ms (View: 19, DB: 1) | 200 OK [http://localhost/memos]

おお、それっぽい。


Loggerのソースを見てみる

apiにはcallメソッドがあると記載されていたので、ソースを見てみた。

/opt/local/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/core_ext/logger.rb

/opt/local/lib/ruby/1.8/logger.rb

class Logger
  class Formatter
    Format = "%s, [%s#%d] %5s -- %s: %s\n"


    def call(severity, time, progname, msg)
      Format % [severity[0..0], format_datetime(time), $$, severity, progname,
        msg2str(msg)]
    end

あった、これっぽい。


Railscastsのようにしてみる

# environment.rb
class Logger
  class Formatter
    def call(severity, time, progname, msg)
      "#{time.to_s(:db)} #{severity} -- #{msg}\n"
    end
  end
end
Processing MemosController#index (for 127.0.0.1 at 2010-03-08 01:07:17) [GET]
2010-03-08 01:07:17 DEBUG --   Memo Load (1.1ms)   SELECT * FROM "memos" LIMIT 10 OFFSET 0
2010-03-08 01:07:18 INFO -- Rendering template within layouts/application
2010-03-08 01:07:18 INFO -- Rendering memos/index
2010-03-08 01:07:18 DEBUG -- Rendered memos/_sidebar (0.7ms)
2010-03-08 01:07:18 INFO -- Completed in 135ms (View: 128, DB: 1) | 200 OK [http://localhost/memos]

おおお、おしい。


ようやく完成

やっぱミリ秒出したり、プロセスIDも出力したいので

デフォルトの内容に若干手を入れることにした。

# environment.rb
class Logger
  class Formatter
    def call(severity, time, progname, msg)
      format = "[%s #%d] %5s -- %s: %s\n"
      format % ["#{time.strftime('%Y-%m-%d %H:%M:%S')}.#{'%06d' % time.usec.to_s}",
                  $$, severity, progname, msg2str(msg)]
    end
  end
end

Formatは使用しているので、format変数を別途定義。


Processing MemosController#index (for 127.0.0.1 at 2010-03-08 02:27:12) [GET]
[2010-03-08 02:27:12.854925 #95499] DEBUG -- :   Memo Load (1.1ms)   SELECT * FROM "memos" LIMIT 10 OFFSET 0
[2010-03-08 02:27:12.938415 #95499]  INFO -- : Rendering template within layouts/application
[2010-03-08 02:27:12.938720 #95499]  INFO -- : Rendering memos/index
[2010-03-08 02:27:12.973117 #95499] DEBUG -- : Rendered memos/_sidebar (0.8ms)
[2010-03-08 02:27:12.976412 #95499]  INFO -- : Completed in 128ms (View: 120, DB: 1) | 200 OK [http://localhost/memos]

あと

log4rも試してみたいところ。

トラックバック - http://rubyist.g.hatena.ne.jp/rochefort/20100310