ruby: 2008年5月アーカイブ

railsなら当然ログイン機能だって一から作るわきゃーない。
プラグインがあるわけだけど、いくつかある。

1.login_engine
2.login_generator
3.Acts_as_authenticated

1は、もう開発がされてないっぽいので辞めたほうがいい。
2が今現在ググったりしてると一番目に付くが、今回は3を採用することにした。

というのも3は2の拡張ということで、普通に考えれば2より良いもののはずだからだ。
追記(6/1):Acts_as_authenticatedももはやメンテナンスされないらしく、今後はrestful_authenticationってやつらしいです。はい。失礼しました。

ここのサイトを参考に勧める。
http://wiki.rubyonrails.org/rails/pages/Acts_as_authenticated

あと、認証の条件として、amazonとかみたいにEメールアドレスをIDとして使用する仕様でいく。

1.インストール
コマンドプロンプト立ち上げてアプリケーションルートに移動後

ruby script/plugin install http://svn.techno-weenie.net/projects/plugins/acts_as_authenticated

2.なんかいろいろ生成
RadrailsのGeneratorタブからそれぞれ
authenticated user account
と入れてGO。
※authenticatedはドロップダウンにはないので手入力

3.僕はPostgreSQLなので

CREATE TABLE "users" ( "id" SERIAL NOT NULL UNIQUE, "login" TEXT, "password" TEXT, PRIMARY KEY("id") ) WITH OIDS;

とテーブル作成

うわさではコレでとりあえず動くらしい、ということで


http://localhost:3002/account/

※ふつうポートは3000

にアクセス。エラー


=======================
undefined method `email'
=======================

そらそうだ。

で、ここで気づいたんだけど/acoountにアクセスすると普通だとindexに飛ばされるはずだけど、めぐりめぐってsignupに飛んでいる。account_controller.rbをみてみるとindexに、Userデータが1件もなかったらsignupに飛ぶって書いてあった。
うーん、これって1件でもデータがあったら使われないなんだよね。いるのかな。。

で、まあとにかくエラーの対処として、signup.rhtmlからemail関連のタグをばっさり消す。

これで再度/accountにアクセスしたら無事、表示できました。

うひょーと思って、とりあえず何も入力せずに「sign up」ボタンを押したらエラー。

続きは明日以降で。

よくあるキーワードで検索してリストがずらずらーってやつです。

viewにこんな感じに書きます。
===================
<% form_tag :action => :search do %>
<%= text_field_tag :keyword, @keyword %>
<%= submit_tag '検索' %>
<% end %>
===================
よく検索で出てくるstart_form_tagではないです。start_form_tag使うと、んなもんないって怒られます。2.0から変わったそうです。

この辺はなんとなく見てもらえればわかると思います。

controllerにこんな感じに書きます。
===================
def search
@keyword = nil if(@keyword = params[:keyword] || "").empty?
cond = @keyword ? ["keyword LIKE ?", "%#{@keyword}%"] : nil
@books = Book.paginate(:page => params[:page], :per_page => 30,
:conditions => cond, :order => "id" )
@keyword = params[:keyword]
render :action => 'index'
end
===================
こないだのwill_paginateのとあんま変わらない。
リストの出力は、自動で作られたindexビューを使ってる。

今回もいろんな人のコードを参考にさせてもらいました。
ありがとうございます。

rails API

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

いや、けっこうAPIの調査コストがきつくなってきた。

http://api.rubyonrails.com/
当然こんな感じの情報はあるものの、逆引き的な利用法だとAPI検索はちょっときつい感が。。。

今日、吉祥寺の本屋に行ってみたもののギュンとくる本はなかった。結局何も買わずに帰ったし。

例えばActionViewとかで、リンクを別窓で出すにはどうしたらいいんだ!というしょぼいことでも、調べるのにそれなりに時間がかかる。
#ちなみにこれは, :popup => true を足したらできた

Javaとかだと、このレベルの情報でもけっこうあっさり見つかるが、まだrubyというかrailsは厳しい感がある。

いや、それはわかってたことだし、このブログもそういったrubyとかrailsとかの情報量の足しにちょっとでもなれば、みたいな理由もあって書いている。

けど、始めのほうの進まない感が続くとビギナーからすればきついし、ruby側からするともったいない。しかも知っている人からすれば、超くだらないレベルとなるとなおさら。

まあ、ここでくじけるつもりはないんですけど。
なんかよい本とか、方法とかあったら教えてほしい!

ルーティングのいじり方とか、コントローラーにアクション追加できないのかとか、今はそんな感じのことを調べて1日が経つ感じです。

何卒よろしくお願いいたします。

下記のエントリのように「rubyでデバッグするNつの方法」的なエントリがいくつか見かけた。
http://blog.s21g.com/articles/212

へー、と思ったけど、やっぱりEclipse党の僕らは・・・radrailsによるデバッグ実行だ!

radrailsのインストールをしたらもうデバッグの条件はできあがっている。
Javaとかでステップ実行するときみたいにブレークポイントを、あのプログラム書くところの左端のところにマークするだけ。

あ、あと、サーバをデバッグモードで起動する必要がある。
EclipseでServersビューで該当のサーバを指定して、
「Start Server in debug mode」
で起動すればOK.

変数の中身を確認したり、Watch式を編集したり、たまらんよね!

いつにも増してありきたりな情報。
というより、これは作業メモだからいいんだ。

文字コードについては、モバイルのことを除けばUTF-8に統一していく方向がハッピーだと思ってるのでUTF-8の方向で

設定は2ヶ所。

①app/controllers/application.rb
================
class ApplicationController < ActionController::Base
before_filter :set_charset

private
def set_charset
headers["Content-Type"] = "text/html; charset=UTF-8"
end
~後略~
================
どたまにいれたってください。
どたまじゃなくてもいいんでしょうけど。
ここは必ず通るとこなんだそうで。

で、Live Http HeadersでもWireSharkでもなんでもいいので

Content-Type: text/html; charset=UTF-8

が確認できればOK牧場。


②config/environment.rb
==================
$KCODE="UTF8"
# Be sure to restart your server when you modify this file
~後略~
==================
どたまにいれたってください。
どたまじゃなくてもいいんでしょうけど。

あと、コメントにも書いてあるけどサーバを再起動してくださいね。

これでOK...と思いきや、viewに直接書いた日本語がもしかしたら文字化けたままの人もいるかもしれない。

たぶんそれは、ファイル自体の文字コードが合ってない可能性が高い。

Eclipseだと
Window>Prefernces>General>Workspace
と追っていくと「Text file encoding」ってのがあるからUTF-8に変更しとく。


ruby on railsでページングをする場合にはpaginateというのを使うらしい。

2.0だとwill_paginateというのになるらしい。
なんか、will_paginateは非効率なSQLを吐くとからしいけど、本家推奨?っぽいのでそのうち改善されるだろうということで、あまりその辺は気にしないことに。

ところで、自分のrailsのバージョンを確かめるには、
ruby script/about
で調べられる。
筆者の場合はこんな感じ。
========================-
About your application's environment
Ruby version 1.8.6 (i386-mswin32)
RubyGems version 0.9.4
Rails version 2.0.2
Active Record version 2.0.2
Action Pack version 2.0.2
Active Resource version 2.0.2
Action Mailer version 2.0.2
Active Support version 2.0.2
Application root C:/Dev/ruby/workspace/
Environment development
Database adapter postgresql
========================-

ちなみに"ruby script/xxxx"ってどこでもできるわけじゃなく、アプリケーションルートじゃないとダメってことに気づくのにけっこう時間がかかった。

話を元にもどしてwill_paginateだけど、プラグインとして別切りにされているのでインストールしなきゃいけない。

ruby script/plugin install \
http://tools.assembla.com/svn/ \
breakout/breakout/vendor/plugins/will_paginate/
↑全部一行で、¥は取って。

で、
コントローラーに
=====================
# @hoges = Hoge.find_by_sql("select * from hoges LIMIT 30")
@hoges = Hoge.paginate(:page => params[:page], :per_page => 30)
=====================

ビューのテキトーなとこに
=====================
<%#= link_to 'Previous page', { :page => @hoge_pages.current.previous }, {:rel=>'prev'} if @hoge_pages.current.previous %>
<%#= link_to 'Next page', { :page => @hoge_pages.current.next }, {:rel=>'next'} if @hoge_pages.current.next %>
<%= will_paginate @hoges, :prev_label=>'«Prev', :next_label=>'Next»' %>
=====================

であっさりページングが完了。

実は、けっこうハマッたことがあって(またかよ)、will_paginateをインストールしても、うんともすんとも反応しなかった。

原因がコントローラのところで
Hoge.pagenate
って書いてたからだった。

いや、よくよく思い出してみるとエラーも「pagenateなんかねーよ」ってでてたんだけど、pagenateでググるとけっこうでてくんのよ。

Javaとかだとメソッドの参照がガッチリきくからこんなことないので(別にJavaの功績じゃないけど)ちょっとあせった。


DBをMySQLからPostgreSQLへ変更したり、変更したからscaffoldしなおしてみたり(たぶん本当は必要ない)してたら、

You have a nil object when you didn't expect it!
The error occurred while evaluating nil.to_sym

というエラーメッセージがでたところでハマッた。

結果からいうと、scaffoldするときにモデル名を複数形にするとこうなってしまうらしい。

たとえばDBにbooksというテーブルがあってscaffoldを生成しようと思ったら

scaffold books ⇒ NG
scaffold book ⇒ OK

という按配なわけ。

こんなの気づかねーよー。。


この状態から、とある事情というか流れで、MySQLからPostgreSQLに。

で、database.ymlとかいじりつつ、直してたら

no such file to load -- postgres

というエラーが。
なんか根本的に足りてないらしい。
そうですね。rubyのpostgreSQLドライバです。

C:\>gem install postgres-pr

筆者の場合はこれだけで片付いた。

あ、もしこの状態と同じ人がいた場合は、LIMITをPostgreSQL用に直してください。
===============-
select * from comics LIMIT 0 , 30

select * from comics LIMIT 30
===============-

久々のruby。

rubyをEclipseで使ってみる5までの流れで、とりあえずなんちゃってアプリができるとこまでできてから早一月。なにもやってない。

で、今日ひさびさに再開してみた。再開にあたり、前回とのちがいはテストデータをそれなりに用意した上で、いじくってみようというアプローチだった。

用意したデータ約5万件。これをscaffoldで作ったアプリに載せようとすると、まあ当たり前なのかも知れないがエラー発生。
========
Exception in thread "Ruby Thread18082330" java.lang.OutOfMemoryError: Java heap space
========
なんか5万件、全部取ろうとするのね。

============
class HogeController < ApplicationController
# GET /hoges
# GET /hoges.xml
def index
@hoges = Hoge.find(:all) ←ALLってるね。
============

とりあえずこれだと具合が悪いので、以下のように修正。
============
def index
# @hoges = Hoge.find(:all) ←ALLってるね。
@hoges = Hoge.find_by_sql("select * from hoge LIMIT 0 , 30")
============

これでとりあえず出る。

IDEの補完のおかげでfind_by_sqlの存在をスピーディーに知ることができたと思ってます。(最近不満も多いけど)

とりあえず今日はコレでおしまい。

ああー、もっと時間がほしい。。。

このアーカイブについて

このページには、2008年5月以降に書かれたブログ記事のうちrubyカテゴリに属しているものが含まれています。

前のアーカイブはruby: 2008年4月です。

次のアーカイブはruby: 2008年6月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。