Hatena::ブログ(Diary)

SpicyCube

2011-08-18

edge rails(3.2.0.beta)に上げてみた

| 07:29 |

戯れに手元のrailsをmasterを見るようにしてみたらサーバが起動しなくなった。

hamlのエラー

#gem 'rails', '3.0.9'
# Bundle edge Rails instead:
gem 'rails', :git => 'git://github.com/rails/rails.git'
$ bundle exec rails s
=> Booting WEBrick
=> Rails 3.2.0.beta application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
Exiting
/Users/y_310/work/sample_prj/vendor/bundle/ruby/1.9.1/gems/haml-3.1.2/lib/haml/template/patch.rb:16:in `alias_method': undefined method `delegate_template_exists?' for class `ActionView::Base' (NameError)

エラーをぐぐってみるとどうやらhamlバグっぽい。

https://github.com/nex3/haml/issues/395

そしてこの問題はここですでに修正済。

https://github.com/nex3/haml/pull/398

ただ普通にgem installして入るバージョンは3.1.0でギリギリこの修正コミットは入っていないみたい。

f:id:y_310:20110818070801p:image

仕方ないのでhamlもedgeを見るようにする。

gem 'haml', :git => 'git://github.com/nex3/haml.git'

rjsのエラー

hamlを最新にして再度サーバを起動しようとするとまたエラーが出た。

=> Booting WEBrick
=> Rails 3.2.0.beta application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
Exiting
/Users/y_310/work/sample_prj/vendor/bundle/ruby/1.9.1/bundler/gems/rails-3b5eb11664b8/actionpack/lib/action_view/railtie.rb:34:in `block (3 levels) in <class:Railtie>': undefined method `debug_rjs=' for ActionView::Base:Class (NoMethodError)

これもググッてみるとこのページがヒットした。

http://weblog.rubyonrails.org/2011/4/21/jquery-new-default

rails3.1で標準のJSライブラリprototype.jsからjQueryになった際に、rjsもデフォルトで入らなくなったらしい。

rjsは必要ないので書いてあるとおりにconfig/environments/development.rbから以下の行を削除

# remove next line
config.action_view.debug_rjs = true

これで無事にサーバが起動した。

2010-10-18

propertyとretainとautoreleaseと

| 04:53 |

Objective-Cの@property (retain)なプロパティへのautoreleaseされているオブジェクトの代入ではまったのでメモしておく。

自分のクラスの中ではselfを使わないとプロパティ経由にはならない

@interface MyClass {
  SomeObject *_prop;
}
@property (nonatomic, retain) SomeObject *_prop;
@end
@implementation MyClass
@synthesize _prop;

  - (void) func:(SomeObject *) prop {
    self._prop = prop; //propのretainCountが+1される
    _prop = prop; //propertyのsetterを経由しないで_propにアクセスするためretainされない
  }
@end

autoreleaseされているオブジェクトを継続的に使う場合は自分でretainする必要がある

@interface MyClass2 {
  SomeObject *_prop2;
}
@end

- (void) func2 {
  _prop2 = [[SomeClass getAutoreleaseObj] retain]; //自分のクラス内で使い続けることをretainで明示する
  _prop2 = [SomeClass getAutoreleaseObj]; //この場合イベントループに戻ったときに解放されてしまう
}

retainしないで代入した場合はautorelease poolが解放されるタイミングで解放されてしまう。

感覚的にはfunc2メソッド内でしか使えないと思ったほうがいい。

retainするpropertyにautoreleaseされたオブジェクトを代入する

最後にこの2つを合わせるとどうなるか。

@interface MyClass3 {
  SomeObject *_prop3;
}
@property (nonatomic, retain) SomeObject *_prop3;
@end
@implementation MyClass3
@synthesize _prop3;

  - (void) func3 {
    self._prop3 = [SomeClass getAutoreleaseObj]; //propertyのsetterでretainされる
    _prop3 = [[SomeClass getAutoreleaseObj] retain]; //直接メンバ変数にアクセスするので自分でretainする必要がある
  }
@end

プロパティ経由なら自分でretainを書いてはいけないし、直接メンバ変数に代入する場合はretainする必要がある。

個人的にはクラス内での代入は下のパターン(自分でretainを書く方法)の方が分かりやすいと思っている。

とはいえselfを付けないとsetterを経由しない、ということを知らないと「なんでpropertyでretainしてるのにさらにretainする必要があるの??」と誤解する僕のような人がいるかもしれないのでまとめてみた。

tokgtokg 2010/12/14 17:02 なるほど、
いわれてみれば、synthesizeでsetterを生成する際に retain を実装しているんでしょうね
だから、直接さわりにいくと retainされないと。

2010-09-13

Rails3でjQueryを使う方法

| 00:59 |

前回の記事の続きでjQueryも使えるようにする。

インストール

Gemfileにjquery-railsを追加

gem 'jquery-rails'

jQueryインストール。(prototype.js関連のファイルが削除される)

$ bundle install
$ rails g jquery:install
      remove  public/javascripts/controls.js
      remove  public/javascripts/dragdrop.js
      remove  public/javascripts/effects.js
      remove  public/javascripts/prototype.js
      create  public/javascripts/jquery.min.js
      create  public/javascripts/jquery.js
    conflict  public/javascripts/rails.js
   Overwrite  public/javascripts/rails.js? (enter "h" for help) [Ynaqdh] y
       force  public/javascripts/rails.js

プロジェクト作成時にprototype.jsが不要だと分かっている場合は-Jで生成を抑止できる。

$ rails new APP_NAME -J

動作確認

views/samples/index.html.hamlに以下の記述を追加。

  3 %table#fade_table
(snip)
 19 :css
 20   #fade_table {
 21     display: none;
 22   }
 23 :javascript
 24   window.onLoad = (function(){
 25     $('#fade_table').fadeIn('slow');
 26   })();

これでサーバ再起動して/samplesにアクセスするとデータのtableがフェードインしながら表示されます。

<head>内の読み込むjsprototypeからjQueryに変わっています。

2010-09-12

Rails3でRspecを使う方法

| 00:12 |

Haml、Sassを使えるようになったので今度はRspecを使えるようにします。

インストール

Rails3ではデフォルトでTest::Unit用のディレクトリやファイルが生成されるのですが、これは不要なのでプロジェクト作成時にTest::Unitを使わないようにします。

$ rails new rails3_rspec -T #-TでSkip Test::Unit

次にGemfileに必要なgemを記述します。

※同時にHaml、Sassを使う方法については以前の記事を参照のこと

Rails3とRuby1.9.2でHamlを使う方法

Rails3でSassを使う方法

gem 'haml-rails'

group :development, :test do
  gem 'rspec-rails', '>= 2.0.0.beta.20'
  gem 'autotest'
  gem 'webrat'
end

Gemfileができたらインストール

$ bundle install vendor/bundle
$ rails generate rspec:install

動作確認

動作確認のためにscaffoldで一通りのファイルを生成してテストを実行

$ rails generate scaffold sample
$ rake db:migrate
$ rake db:test:prepare #テスト用DBを作成
$ rake spec
...............**............
(省略)
29 examples, 0 failures, 2 pending

こんな感じでRspecが使えるようになります。

また、autotestを使うとファイルに変更があったときに自動でテストが走るようになります。

$ bundle exec autotest

参考

http://github.com/rspec/rspec-rails#readme

http://www.kuwazou.net/blog/rails/?p=66

2010-09-05

Rails3でSassを使う方法

| 00:59 |

せっかくHamlを使えるようにしたのでSassも使えるようにしたいところ。

とはいってもSassはHamlに同梱されているので前回の記事の手順でインストールまでは既に済んでいます。

設定

config/initializers/sass_config.rbを作成して以下の記述を追加。

#デフォルトのスタイルシートパスを削除
Sass::Plugin.remove_template_location("./public/stylesheets/sass")
#app/stylesheetsをSass用のディレクトリに設定
Sass::Plugin.add_template_location("./app/stylesheets")
#最小サイズのCSSに変換する
Sass::Plugin.options[:style] = :compressed

デフォルトのパスでも問題ないのですが、Sassは.sassファイルから.cssファイルへコンパイルする仕組みのためソースファイルと生成されたCSSの場所を分離しておいたほうがスッキリすると思います。

またSassの変換結果のスタイルは以下のドキュメントに書かれていますので好きなものを設定してください。

http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#output_style

動作確認

Sass用のディレクトリとファイルを作成

$ mkdir app/stylesheets
$ vim app/stylesheets/sample.sass

以下の記述をsample.sassに追加

h1
  :font
    :size 200%
    :weight bold
  :border 16px solid #DD66CC
  :width 400px
  :padding 5px 
p
  :font-weight bold
  :border 16px solid #6666DD
  :width 400px
  :padding 5px 
$ rails server
$ open http://localhost:3000/sample/index

こんな画面が表示されたら動作確認OK。public/stylesheets/sample.cssが生成されているはず。

f:id:y_310:20100906005347p:image

参考

http://stackoverflow.com/questions/2807214

http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html