fc2ブログ

2024.12 «  - - - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 - » 2025.02
TOP > CATEGORY > Railsを初めて動かす

TOP

railsを初めて動かす05【validation入力項目エラーチェックその2】 

2007年05月26日 ()
前回、エラーチェックが恐ろしく簡単に出来るのは分かりましたが、もうちょっとカスタマイズできるみたいなので、やってみました。

まず、エラーメッセージのカスタマイズができるみたいです。

:message => "エラーメッセージ"


でエラーメッセージがカスタマイズできるようです。

画面に表示されるエラーメッセージは、

カラム名 + "エラーメッセージ"


なので、気を利かせてエラーメッセージをかかねば、ですね。

では、早速、bookモデルファイルを更にいじります。

# vi myFirst/app/models/book.rb

class Book < ActiveRecord::Base
  validates_presence_of :title, :message => "should be entered!!!!"
  validates_length_of :title, :author, :maximum => 5
end



てな感じで、titleの必須チェックのところにカスタムエラーメッセージを付けてみました。

ちなみに、

class Book < ActiveRecord::Base
  validates_presence_of :title, :message => "を入力してください"
  validates_length_of :title, :author, :maximum => 5
end



こんな感じで、日本語メッセージも付け加えられるようです。もしかしてブラウザによっては文字化けするのかな?私のFirefoxツー!では大丈夫でしたよ。

【広告】

[2007.05.26(Sat) 01:38] Railsを初めて動かすTrackback(0) | Comments(0) 見る▼
↑TOPへ

railsを初めて動かす04【validation入力項目エラーチェックその1】 

2007年05月24日 ()
更に、Edit画面での入力値のエラーチェック(validation)も簡単にできるという噂を聞いたので、早速いろいろ調べてみました。

modelを使ってエラーチェックするらしいです。まあ、もちろん違うやり方、たとえばcontrolを使ってエラーチェックをするやり方もたぶんあるんでしょうけど、とにかく、このmodelのエラーチェック機能を使うと超ハヤイ!ことが分かりました。

例えば、DBのBooksテーブルをモデリングする(とかいう怪しい表現を使ってみた)、Bookモデルに、titleの入力を必須にするエラーチェックを付けてみましょう。

# vi myFirst/app/models/book.rb


class Book < ActiveRecord::Base
end



と、最初は空の状態のmodelです。そこに一行だけ加えて

class Book < ActiveRecord::Base
  validates_presence_of :title
end



として、http://localhost:3000/book/edit/1 にアクセスして、編集画面を表示して(1というのは、レコードidのこと)、Titleの欄を空にしてEditボタンをクリックします。

そしたらぁ、あSo-!エラーチェックが動いてエラーメッセージが勝手に表示されたんだぞー。あぁーいとぅいまてーん。

↑流行りが過ぎたら削除するつもり。

ちなみに、:titleを:Titleと大文字に書いても同じ動きをしました。

では次に、Titleを5文字以内で、という条件も追加してみました。

class Book < ActiveRecord::Base
  validates_presence_of :title
  validates_length_of :title, :maximum => 5
end



そして更に更に、Authorも5文字以内で、という条件も追加してみました。

more book.rb
class Book < ActiveRecord::Base
  validates_presence_of :title
  validates_length_of :title, :author, :maximum => 5
end



驚くほど簡単に出来て、もうシビレるワァ。

【広告】

[2007.05.24(Thu) 00:36] Railsを初めて動かすTrackback(0) | Comments(4) 見る▼
↑TOPへ


COMMENT

エラー時の画面の値について by くまこ
はじめまして。いつも参考にさせていただいてます。

いきなりで大変申し訳ないのですが・・・

validates_presence_of を使って画面の一部のフィールドの入力チェックをしようとしてエラーが発生した場合、
fiel_fieldでファイルのアップロードをするフィールド(入力チェックはしない)だけが
エラー画面で値が消えてしまうのですが
これはもうどうしようもないことなのでしょうか・・・?
file_fieldの値を残したままエラーメッセージを出すことは可能ですか?

普通にだと無理でしょうか by 自分
質問ありがとうございます。
:multipart=>true な感じのフォームでfile_fieldからどういうデータがPOSTされているか調べましたが、ファイルのフルパスは送信されていませんでした。ファイル名だけ送信されているようです。

↓な感じです。

filename="testfile1.txt" Content-Type: text/plain

なので、フルパス付きファイル名をエラー画面で表示させるのはなかなか難しいんじゃないかな、と思います。

勝手な推測ですがAJAX的な画面にすればなんとかうまくいくかもしれませんがね。

ちなみに、ブラウザからどんなHTTPパケットが送受信されているかどうかを調べるのにはhttpfoxが便利ですよ。

ありがとうございます! by くまこ
すごく丁寧な回答をありがとうございました!
とりあえず消えてしまうままで進めてみようと思います(^^;)

httpfoxというアドオンも知らなかったので今後使ってみますね。
いま作っているアプリはfirefoxで動かない部分があってIEで作っているので・・・

またわからないことがあれば質問するかもしれませんが
そのときはどうぞよろしくお願いします。

どういたしまして by 自分
たいしたアドバイスできなくてごめんなさいね。

firefoxのアドオンは強力なものがたくさんですので重宝してます。firebugもそう、ietabもそう。web developerも!!!

また何かあったら遊びに来てください。

コメントを閉じる▲

railsを初めて動かす03【スタイルシートcssをいじる】 

2007年05月22日 ()
この前作った

http://localhost:3000/book

にブラウザでアクセスすると、book一覧が表示されますが、一覧表に枠線が付いていないので、枠線を付けてみようかと思います。

なんの指針も参考もなく、ただ独断でこうしてみよう、と思い立った今回のスタイルシート追加作戦ですので、正規のやり方ではないかも知れません。

あしからず…


まず、画面を表示しているとおぼわしきファイルを見つけます。

だいたい自分のアプリに関係ありそうなものは、appディレクトリに入っているようなので、

# cd myFirst/app



と移動してみます。

そうすると、appディレクトリには、

controllers
helpers
models
views



という複数形の名前のディレクトリと、

generate



というファイルがありました。

どーみても、viewsディレクトリが怪しいですね、ネーミングが。

というわけで

# cd views



とすると、viewsディレクトリの中に、bookディレクトリがありました。

# cd book



bookディレクトリの中には、

_form.rhtml
edit.rhtml
list.rhtml
new.rhtml
show.rhtml



ファイルがありましたとさ。

今回探しているのは、一覧画面だから、list.rhtmlでしょうね。

それにしても、

http://localhost:3000/book



にアクセスしたら、list.rhtmlが表示されるなんて、URLには何もlistという文字を指定していないのにふ・し・ぎ!

list.rhtmlを抜粋すると、

<table>
  <tr>
  <% for column in Book.content_columns %>
    <th><%= column.human_name %></th>
  <% end %>
  </tr>

<% for book in @books %>
  <tr>
  <% for column in Book.content_columns %>
    <td><%=h book.send(column.name) %></td>
  <% end %>
    <td><%= link_to 'Show', :action => 'show', :id => book %></td>
    <td><%= link_to 'Edit', :action => 'edit', :id => book %></td>
    <td><%= link_to 'Destroy', { :action => 'destroy', :id => book }, :confirm => 'Are you sure?', :method => :post %></td>
  </tr>
<% end %>
</table>



となっていたので、この中のthタグとtdタグに、独自のスタイルシートのクラスを勝手に埋め込む決意をしました。


ところで、そのスタイルシートファイルをいじればいいのでしょうか。

ということを調べるのに、

http://localhost:3000/book



画面をもう一回表示させて、HTMLソースコードを見てみたら、

<link href="/stylesheets/scaffold.css?1175694043" media="screen" rel="Stylesheet" type="text/css" />



というcssファイルへリンクしている行が唯一のスタイルシートとの接点だったので、Webサーバのドキュメントルートであるpublicの下のこのスタイルシートファイルをいじってみよう、と思いました。

# cd
# cd myFirst/public/stylesheets/



この中の、scaffold.cssファイルの一番最後に、

.tableFrame {
  background-color: #fff;
  border: 1px solid #3e9;
}



を追加しまして、

先ほどのapp/views/book/list.rhtmlファイルの抜粋部分を、

<table>
  <tr>
  <% for column in Book.content_columns %>
    <th class="tableFrame"><%= column.human_name %></th>
  <% end %>
    <th class="tableFrame"></th>
    <th class="tableFrame"></th>
    <th class="tableFrame"></th>
  </tr>
 
<% for book in @books %>
  <tr>
  <% for column in Book.content_columns %>
    <td class="tableFrame"><%=h book.send(column.name) %></td>
  <% end %>
    <td class="tableFrame"><%= link_to 'Show', :action => 'show', :id => book %></td>
    <td class="tableFrame"><%= link_to 'Edit', :action => 'edit', :id => book %></td>
    <td class="tableFrame"><%= link_to 'Destroy', { :action => 'destroy', :id => book }, :confirm => 'Are you sure?', :method => :post %></td>
  </tr>
<% end %>
</table>




こんな感じに、tableFrameクラスのオンパレードで盛り上げてあげると、

http://localhost:3000/book




それなりにイケてる表示がされました。

なんだか今回はrailsとあんまり関係ないような気がしますが、まあ、いいや。


【広告】

[2007.05.22(Tue) 01:41] Railsを初めて動かすTrackback(0) | Comments(0) 見る▼
↑TOPへ

railsを初めて動かす02【DBへ接続成功】 

2007年05月03日 ()
前回は、DBに接続しないで終わっちゃったけど、今回は、がんばってDB接続しているアプリケーションを作ってみようと思います。

思っているだけで、成功するかどうかは、わからんちんどものっちめちん。


Webを漁ると、どうやらscaffoldというコマンド(?)を使うと、modelやcontrollerを勝手に作ってくれるらしいです。ただ、modelやcontrollerがなぜDB接続を自動的にやってくれるかどうかは不明なところですが、まあ、とにかくやってみましょうかね。

たぶんやるのは以下の項目です。

1.ほにゃらら_developmentという名前のDBをつくる
2.つくったDBに対するユーザの権限を与える(あの・・・mysqlだけかな、これが必要なのは?)
3.つくったDBにidという主キーを持つテーブルを、テーブル名複数形でつくる
4.script/generate scaffold テーブル名単数形 テーブル名単数形 というコマンドを打つ
5.あとは神に祈るのみ

という順番でできるのかなあ?


1.ほにゃらら_developmentという名前のDBをつくる


# mysql -u root



でrootとしてログインする。rootユーザに、パスワードを設定してしまった場合は、



# mysql -u root -p



が良いらしい。

config/database.ymlファイルに、myFirst_developmentというデータベース名で指定してあったので、それをそのまま使わせていただきます。


$mysql CREATE DATABASE myFirst_development;




2.つくったDBに対するユーザの権限を与える(あの・・・mysqlだけかな、これが必要なのは?)


$mysql grant all on myFirst_development.* to 'root'@'localhost';




3.つくったDBにidという主キーを持つテーブルを、テーブル名複数形でつくる


$mysql use myFirst_development;
DROP TABLE IF EXISTS books;
CREATE TABLE books(
id INT NOT NULL AUTO_INCREMENT,
title VARCHAR(400) NOT NULL DEFAULT '(no title)',
author VARCHAR(500) NOT NULL DEFAULT '(no author)',
primary key(id)
) ENGINE = InnoDB;



4.script/generate scaffold テーブル名単数形 テーブル名単数形 というコマンドを打つ


# script/generate scaffold book book

exists app/controllers/
exists app/helpers/
create app/views/book
exists app/views/layouts/
exists test/functional/
dependency model
create app/models/
create test/unit/
create test/fixtures/
create app/models/book.rb
create test/unit/book_test.rb
create test/fixtures/books.yml
No such file or directory - /tmp/mysql.sock



ぐはぁ、なんだ、最後のエラーは??

という疑問の答えはこちらに載っていました。

さすが先人は偉い。

config/database.ymlに、


socket: /var/lib/mysql/mysql.sock



という行を、host:.....の行の後に加えましたとさ。

railsはソケット通信をするのか。なるほど。などと分かった気になってみました。

さて、book関連のファイルを一回キレイにしてから、再び同じscaffoldコマンドに挑戦します。でも、script/destroyが、キレイにするためのクリーンアップ用のコマンドかどうかは定かではないですけど使っちゃう。なんとなくそうではないのかな?と思っています。



# script/destroy scaffold book book
# script/generate scaffold book book

exists app/controllers/
exists app/helpers/
create app/views/book
create app/views/layouts/
exists test/functional/
dependency model
create app/models/
create test/unit/
create test/fixtures/
create app/models/book.rb
create test/unit/book_test.rb
create test/fixtures/books.yml
create app/views/book/_form.rhtml
create app/views/book/list.rhtml
create app/views/book/show.rhtml
create app/views/book/new.rhtml
create app/views/book/edit.rhtml
create app/controllers/book_controller.rb
create test/functional/book_controller_test.rb
create app/helpers/book_helper.rb
create app/views/layouts/book.rhtml
create public/stylesheets/scaffold.css



そしてWEBrickちゃんを再起動させます。


# [ctrl]+c
# script/server



http://localhost:3000/book にアクセス!

あぁ・・・動いたわぁん。

ブラウザからbookテーブルにデータを新規追加したり変更したり削除したりできますね。

苦節2時間、いろいろありましたが、大きな一歩を踏み出せたような気がします。

今回は、DBのテーブル名と、主キーは、決まった規則があるっていうのを覚えておけば、いいかなぁ。あとソケット通信にも気をつけて!


【広告】

[2007.05.03(Thu) 00:11] Railsを初めて動かすTrackback(0) | Comments(0) 見る▼
↑TOPへ

railsを初めて動かす01【とにかく動くことが目標】 

2007年05月01日 ()
railsコマンドで作ったアプリケーション(myFirstという名前で作ってみた)をWebサーバで動かしてみたいと思います。

もうすでに、rails myFirstコマンドでmyFirstというアプリケーションがつくってあるので、まずコマンドプロンプトで、Webサーバを動かしてみましょうっと。

# cd myFirst
# script/server



すると、WEBrickというWebサーバが立ち上がりました。しかもプロンプトはWebサーバのログをはき出すためのバッファリング状態で、これ以上コマンドを受け付けてくれなさそうです。この状態でctrl+cを押すと、WEBサーバが停止するんだって。

仕方なく、別のターミナルを開いて、新たにコマンドプロンプトを入力できるようにしました。

それとは別に、Webブラウザから、3000ポートでこのマシンにアクセスすると、Railsの最初の画面が表示されています。

http://localhost:3000/



これから何をしなければならないか、番号が振って書いてありますね。


1.自分用のDBを作ってconfig/database.ymlを編集する

2.script/generateコマンドを使ってモデルとコントローラを作る

3.このファイルを消すか、ファイル名を変えるかして、デフォルトルートをconfig/routes.rbファイルで設定する


あぁ、前途多難だなあ、うまくいくでしょうか。

まずは、1番
1.自分用のDBを作ってconfig/database.ymlを編集する

早速config/database.ymlファイルを見てみます。

# MySQL (default setup). Versions 4.1 and 5.0 are recommended.
#
# Install the MySQL driver:
# gem install mysql
# On MacOS X:
# gem install mysql -- --include=/usr/local/lib
# On Windows:
# gem install mysql
# Choose the win32 build.
# Install MySQL and put its /bin directory on your path.
#
# And be sure to use new-style password hashing:
# http://dev.mysql.com/doc/refman/5.0/en/old-client.html
development:
adapter: mysql
database: myFirst_development
username: root
password:
host: localhost

# Warning: The database defined as 'test' will be erased and
# re-generated from your development database when you run 'rake'.
# Do not set this db to the same as development or production.
test:
adapter: mysql
database: myFirst_test
username: root
password:
host: localhost

production:
adapter: mysql
database: myFirst_production
username: root
password:
host: localhost



なんだか、なにもいじらなくてもうまくいくかもしれないなあ。次の手順に進んでみるか。

2.script/generateコマンドを使ってモデルとコントローラを作る

これ、なんのこっちゃ分からないので、ヘルプをみてみよう

# script/generate



ふむふむ、全然分からない。えーいやけっぱちです!

# script/generate controller MyCon

exists app/controllers/
exists app/helpers/
create app/views/my_con
exists test/functional/
create app/controllers/my_con_controller.rb
create test/functional/my_con_controller_test.rb
create app/helpers/my_con_helper.rb



何かが出来ました!

3.このファイルを消すか、ファイル名を変えるかして、デフォルトルートをconfig/routes.rbファイルで設定する

config/routes.rbの中をのぞくと、public/index.htmlを消しとけ!ということなので、消しました。

そしてもう一度http://localhost:3000/にアクセスすると、ヤッター!さっきとは違うメッセージ

Routing Error

no route found to match "/" with {:method=>:get}



が表示されました。まあ、エラーが表示されているんですけどね。

ここまできて、さっき作ったコントロールMyConにアクセスできないかなー、と思いました。

http://localhost:3000/MyCon/



にアクセスするとRouting Errorが・・・がっかり

http://localhost:3000/my_con/

Unknown action

No action responded to index



とOh Yes!どうやらWebサーバにアクセスできたようです。エラーだけど・・

とりあえずこれで第一段階クリアかな(?)次回は、DBも絡めてアプリを作ってみたいなあ。




【広告】

[2007.05.01(Tue) 18:47] Railsを初めて動かすTrackback(0) | Comments(0) 見る▼
↑TOPへ

TOP