suakx devlog

開発ブログのような

Posts tagged rails3

0 notes &

rvmを使ってruby1.9.2を入れてみた

rails3.0betaを使うためにrvmをつかってruby1.9.2を入れてみました。rvmは便利なrubyのバージョンマネジャです。

普通に rvm install 1.9.2 って入れるとpreview版が入ってrails使えません。 rvm install 1.9.2-head が正解です。

が、それを使用とするとエラーが(Leopardでのテストです。)、、、ここ見て解決しました。過去のセキュリティーウプグレがcpanを壊してしまったのが原因なようです。rubyを入れるのにperlのcpan入れ直しというなかなか興味深いことが起きます。

0 notes &

rails3.0beta2が出たみたいなので変えてみたけど

前とは違ってインストールは

gem install rails —prerelease

だけで終わるようになってます。

rails plugin install git://github.com/odorcicd/authlogic.git -r rails3
rails plugin install git://github.com/intridea/subdomain-fu.git

のプラギンを使ってbeta1でアプリを作ってたのですが、エラーが出ます。ここを見るとモジュールの位置をごっそり変えているようです。プラギンでこういうのに追随するのは非常にめんどくさいです。

おまけにオフィシャルのリリースを見ると

Note that Ruby 1.8.7 p248 and p249 has marshaling bugs that crash both Rails 2.3.x and Rails 3.0.0. Ruby 1.9.1 outright segfaults on Rails 3.0.0, so if you want to use Rails 3 with 1.9.x, jump on 1.9.2 trunk for smooth sailing.

と小さい文字で書いてある。1.9.2を使えってことみたいです。不確定要素大杉な現状に少々うんざりな感じになってきました。

1 note &

rails3.0betaでハマリ(find_byよりwhereがいいみたい)

controllerで

@posts = Post.find_by_user_id(login.id)  # SELECT "posts".* FROM "posts" WHERE ("posts"."user_id" = 1) LIMIT 1

こう書いて、viewで

@posts.each do |post|

こう書いてたら、

undefined method `each' for

と意味不明なエラー

@posts = Post.where("user_id =?", login.id)  # SELECT "posts".* FROM "posts" WHERE (user_id =1)

こう書き直すと直った。かなり時間が取られた。皆さん気をつけましょう。

1 note &

rails3.0betaでActionMailerを試してみた

前回に引き続きActionMailerを試してみました。ソースはここ

rails g mailer notifier

でapp/mailers/notifier.rb と app/views/notifierができる。(modelsにできないのが新しい)

こんな感じで書いておくと問題なくメールが送れる。
ヘッダーはこんな感じ。

Subject: Password Reset Instructions
Mime-Version: 1.0
Content-Type: text/plain;
charset="utf-8";
Content-Transfer-Encoding: 7bit

問題は:subjectに日本語を入れた場合、

/app/mailers/notifier.rb:8: invalid multibyte char (US-ASCII)

ってなエラーがでて受け付けてくれない。ruby1.9からの特徴。
でnotifier.rbのファイルの頭に、

# -*- coding: utf-8 -*-

を入れておくとヘッダーは

Subject: =?utf-8?Q?=E3=81=82Password_Reset_Instructions?=

にかわって受け付けてくれる。

reset_password_instructions.text.erbに日本語を入れた場合

Non US-ASCII detected and no content-transfer-encoding defined.
Defaulting to 8bit, set your own if this is incorrect.
/usr/lib/ruby/1.9.1/net/protocol.rb:291: warning: regexp match /.../n against to UTF-8 string

こんな感じのお知らせがでて、ヘッダーは

Content-Transfer-Encoding: 8bit

に変ってくれてる。

<%# coding: utf-8 %>

を頭につけようが付けまいが関係ない。 rails3.0でのactionmailerはTMailからMailに変ったのでその辺がその辺の影響かも(ソースはまだ見てない)。日本語メールのエンコードってISO-2022-JPがデフォというのはわかるけど、アプリの国際化を考えると、IE6を無視しよう運動が行われているようにUTF8が使えないメーラーは無視で簡略化する方向でいいのかと思う今日この頃です。とりあえずgmailとdocomoは

Subject: =?utf-8?Q?=E3=81=82Password_Reset_Instructions?=
Mime-Version: 1.0
Content-Type: text/plain;
charset="utf-8";
Content-Transfer-Encoding: 8bit

のヘッダーは理解してくれてます。

0 notes &

routes.rbでの注記

railsでのroute.rbでしてしまったタイポから気になったとこを少々。

resources :productsと書いた場合rake routesは

             GET    /products(.:format)          {:controller=>"products", :action=>"index"}
    products POST   /products(.:format)          {:controller=>"products", :action=>"create"}
 new_product GET    /products/new(.:format)      {:controller=>"products", :action=>"new"}
             GET    /products/:id(.:format)      {:controller=>"products", :action=>"show"}
             PUT    /products/:id(.:format)      {:controller=>"products", :action=>"update"}
     product DELETE /products/:id(.:format)      {:controller=>"products", :action=>"destroy"}
edit_product GET    /products/:id/edit(.:format) {:controller=>"products", :action=>"edit"}

resource :productsと書いた場合rake routesは

             GET    /product(.:format)      {:controller=>"products", :action=>"show"}
             POST   /product(.:format)      {:controller=>"products", :action=>"create"}
             PUT    /product(.:format)      {:controller=>"products", :action=>"update"}
     product DELETE /product(.:format)      {:controller=>"products", :action=>"destroy"}
 new_product GET    /product/new(.:format)  {:controller=>"products", :action=>"new"}
edit_product GET    /product/edit(.:format) {:controller=>"products", :action=>"edit"}

resources :productと書いた場合rake routesは

             GET    /products(.:format)          {:controller=>"products", :action=>"index"}
    products POST   /products(.:format)          {:controller=>"products", :action=>"create"}
 new_product GET    /products/new(.:format)      {:controller=>"products", :action=>"new"}
             GET    /products/:id(.:format)      {:controller=>"products", :action=>"show"}
             PUT    /products/:id(.:format)      {:controller=>"products", :action=>"update"}
     product DELETE /products/:id(.:format)      {:controller=>"products", :action=>"destroy"}
edit_product GET    /products/:id/edit(.:format) {:controller=>"products", :action=>"edit"}

resource :productと書いた場合rake routesは

             GET    /product(.:format)      {:controller=>"products", :action=>"show"}
             POST   /product(.:format)      {:controller=>"products", :action=>"create"}
             PUT    /product(.:format)      {:controller=>"products", :action=>"update"}
     product DELETE /product(.:format)      {:controller=>"products", :action=>"destroy"}
 new_product GET    /product/new(.:format)  {:controller=>"products", :action=>"new"}
edit_product GET    /product/edit(.:format) {:controller=>"products", :action=>"edit"}

となり、controllerは複数形にしておかないといけないということと、resourceを単数系か複数形かにすることによってresetfulの挙動が変るということ。

1 note &

authlogicでログインログアウトを実装

前回に続き少しばかり進歩させました。ソースはここにおいてます。ここを参考にしました。

urlの設計はtumblrを意識してみました。

config/routes.rb

:as => ‘login’ って書いておくと、login_pathが’/login’までの相対パスの、login_urlが絶対パスのurlが表示されます。

tumblrを意識しているのでloginはemailとpasswordでの実装です。この際、

app/models/user.rb

と書く必要があります。

次回はforgot_passwordを実装したいです。パスワードのリマインダをメール送信します。TMailからMailに取って代わったようなので日本語も含めていろいろテストしてみたいです。

3 notes &

rails3.0betaでauthlogicを試してみました

せっかくなのでrails3の勉強もかねてauthlogicが使えるかどうか試してみました。今のところ大丈夫そうです。rails3がでるまでにログイン認証のつくり込みができればと考えています。

前回作成した環境で動かしています。Lucid alpha 3+ruby1.9.1+rails3.0betaです。3月21日時点、Lucid alpha 3インスコ後sudo aptitude updateとsudo aptitude upgradeをかますとvm上でも画面が表示されるようになってます。

ではスタート。

rails r3b_authtest
rails plugin install git://github.com/binarylogic/authlogic.git

あとは基本的に
http://github.com/binarylogic/authlogic_example
こちらのコードのコピペです。
http://github.com/suakx/r3b_authtest/tree/version-0.0.1
にコードはおいてあります。 

変更した点は2カ所

config/application.rb

config/routes.rb

routes.rbはかなりの変更がありました。
http://edgeguides.rubyonrails.org/routing.html
http://railscasts.com/episodes/203-routing-in-rails-3
あたりが参考になるでしょう。

次回はちゃんとログイン、ログアウトを作成予定です。

0 notes &

とりあえずrails3をつかってみる

rails user これでuserプロジェクトができる。

rails c で前の script/console、

rails s で前の script/server

Gemfileというのがある。これに必要なgemを書き込んでおくと、

sudo bundle install で

必要なgemがシステムにインストールされる。

bundle package で必要なgemが vendor/cache にインストールされる。

rails plugin install でプラギンのインスコ。

0 notes &

lucidにruby1.9.1とrails3.0betaをいれてみた

ubuntu 10.04 alpha3でやっとserver版がvmware上にインスコできるようになったので(画面はまだ表示されないけどopenssh-serverを入れとくとアクセスはできる)、ruby1.9.1とrails3.0betaを入れてみました。

まずは基本環境

sudo aptitude update
sudo aptitude upgrade
sudo aptitude install open-vm-tools

次にmysql、sqlite3、imagemagick、gitをインストール

sudo aptitude install sqlite3 libsqlite3-dev mysql-server libmysqlclient16-dev
sudo aptitude install libmagick9-dev
sudo aptitude install git-core

rubyとgemをインスコ

sudo aptitude install ruby1.9.1-dev ruby1.9.1 ri1.9.1 rdoc1.9.1 irb1.9.1 libreadline-ruby1.9.1 libruby1.9.1 libopenssl-ruby1.9.1
sudo ln -s /usr/bin/ruby1.9.1 /usr/bin/ruby
sudo ln -s /usr/bin/ri1.9.1 /usr/bin/ri
sudo ln -s /usr/bin/rdoc1.9.1 /usr/bin/rdoc
sudo ln -s /usr/bin/irb1.9.1 /usr/bin/irb
wget http://rubyforge.org/frs/download.php/69365/rubygems-1.3.6.tgz
tar xzvf rubygems-1.3.6.tgz
cd  rubygems-1.3.6
sudo ruby setup.rb
sudo ln -s /usr/bin/gem1.9.1 /usr/bin/gem
sudo gem update
sudo gem update --system

rails3.0betaをインスコ

sudo gem install tzinfo builder memcache-client rack rack-test rack-mount erubis mail text-format thor bundler i18n --no-ri --no-rdoc
sudo gem install rails --pre --no-ri --no-rdoc

.bashrcの最後に追加のおまじない

GEM_HOME=/usr/lib/ruby1.9.1/gems/1.9.1
export GEM_HOME

あと、どういうわけかtestというアプリ名を付けると立ち上がりません。