Ruby on Rails
チュートリアルステップ6

<— チュートリアルステップ4 / チュートリアルステップ5 | チュートリアル | BasicRelationalのチュートリアル —>

Railsアプリケーションの開発!

チュートリアルステップ3で生成したビュー(ビューを理解するを参照) app/views/friends/view.rhtmlを変更してください。好きなエディタでこのファイルを開いて、次のように変更してください: (もし、創造的側面が駆り立てるなら、遠慮なくHTMLで装飾してください)

<html>
  <body>
    <h1>Friends#view</h1>
    <p>This page will display one friend</p>
    <p>
    <%= @person.name %><br />
    <%= @person.street1 %><br />
    <%= @person.street2 %><br />
    <%= @person.city %><br />
    <%= @person.state %><br />
    <%= @person.zip %><br />
    </p>
  </body>
</html>

動的なコンテンツをどのように出力しようとしているか注意してください。@personオブジェクトはコントローラオブジェクトによって生成されなければなりません。そこで、app/controllers/friends_controller.rbを開いてください。

メソッドがすでに生成されていることに注意してください。

viewメソッドを探し、それを次のように置き換えてください:

def view
  @person = Person.find(1)
end

これは、データベースから出力された最初のレコードを取得し、それをviewが利用できるように@person変数に格納します。

さて、モデルクラスをより注意深く見る必要があります。そこで、app/models/person.rbを開いてください。チュートリアルステップ4で、new_modelスクリプトを実行したときに生成されたスケルトンクラスを見るでしょう:

class Person < ActiveRecord::Base
end

Personクラスは\ActiveRecord::Baseのサブクラスなので、すでにほとんどの作業は完了しています。たとえばaccessorメソッドは動的に生成されるので、それを自分で書く必要はありません。

このクラスは、作成したpeopleテーブルとの対応をどのようにして知るのでしょうか?ActiveRecordはクラス名を複数形にし、データベース中のその名前のテーブルを探します。ActiveRecordがこれを行うためのルールは、この文書で述べられています。

Apacheをセットアップするために、Railsを始めるのすべてのステップを実行したか確認してください。この代わりに、次のようにしてWEBrickサーブレットを実行することがでることに注意してください:

ruby script/server

または

./script/server --environment=production
for production environment under *nix

ブラウザでhttp://RAILS/friends/view(ここでRAILSはホスト名とrailsをインストールしたベースURLのパスです)表示すると、動作中のアプリケーションを見ることができるでしょう! URLの中にコントローラ(friends)とアクション(view)の両方を含ませる方法に注意してください!

BasicRelationalのチュートリアルに進む | チュートリアル
または、スキップしているなら チュートリアルステップ5 (テスト)



コメント:下記のGotchaを避けるために、displayviewに変更しました。showも別名のひとつですが、これは後のチュートリアルで扱います。

コメント:model :friendの追加がここから削除された理由について、誰か知りませんか? 単に私がrailsの古いバージョンを使っていて、新しいバージョンでは自動的にこの行を追加するのでしょうか? gemによる、と私は5月5日現在のカレントバージョンを使っています。
返答:model :friendは、セッションの参照を維持するためのモデルの宣言に使われているように見えるので、必要のないところで複雑さを増すだけだと思います。その件についての更なる議論はモデルメソッドを使う場合を参照してください。

コメント:私が‘friends/display’wを表示させようとしたとき、次のようなエラーダンプが出力されました:



" Showing /friends/display.rhtml where line #6 raised undefined 
method `name' for nil:NilClass
3: <h1>Friends#display</h1>
4: <p>This page will display one friend</p>
5: <p>
6: <%= @person.name %><br />
7: <%= @person.street1 %><br />
8: <%= @person.street2 %><br />
9: <%= @person.city %><br />" 


明らかに@personはnilですが、いい考えがありません。チュートリアルに従っており、データベースクエリはコマンドラインで機能しています

返答: これは、viewがdisplayと呼ばれているからです。これと適当なビューファイルを別のもの(たとえばdisplay2とisplay2.rhtml)に変更すれば、適切にロードされたページが表示されます。わりあい普通のGotchaです。

返答の返答:これで正しく動作しました: apps/controllers/friends_controller.rbを編集し、
‘def display’の行を‘def display2’に変更。それから、app/views/friends/display.rhtmlファイルをapp/views/friends/display2.rhtmlにリネームする。これで動くはずです。



コメント:私はサーバにApache使っていて、http://localhostにアクセスするとインデックスページが表示されます。しかし、http://localhost/friends/viewを表示しようとすると、‘404 – Not found’と表示されます。私はチュートリアルに従い、すべてのファイルとコードを正確に与えました。私がどこで間違ったのか誰か教えてください。

返答:http://localhost/public/friends/viewへのアクセスを試してください。

返答:http://localhost/public/friends/viewもうまくいきませんでした(少なくとも私のところでは)。Windowsでは、私がしなければいけないことは%SystemRoot%\system32\drivers\etc\hostsを編集し、“127.0.0.1 rails”の行を追加することです(ここで railsは、httpd.confのVirtualHostエントリのServerNameです)。

返答: vhostの設定の中のすべてのパスが正しくセットされていることを確認してください。



コメント:私はApachとMySqlを使っていますが、以下のエラーが表示されました。手がかりはありますか?データベース、テーブル、エントリは正常です。

Errno::ENOENT in Friends#view

No such file or directory - /tmp/mysql.sock

RAILS_ROOT: ../config/..
Application Trace | Framework Trace | Full Trace

/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.14.0/lib/active_record/vendor/mysql.rb:104:in `initialize'
...
...
...
#{RAILS_ROOT}/app/controllers/friends_controller.rb:7:in `view'

返答: database.ymlファイルを読むまで同じ問題がありました:

# Install the MySQL driver:
#   gem install mysql


これで私のところでは解決しました。

返答:返答: 私のところでは、gem install mysqlが正しく動作しません。


Building native extensions.  This could take a while...
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.


mysql5にアップグレードする必要があるのではないかと思うのですが、mysqlがまだubuntu用にパッケージ化されていないという別の問題があります。

カテゴリ:チュートリアル
返答:返答:
実質的には、コンパイラの問題です。正しいmysql_configを配置しているか確認してください。私はここの支持に従いました: http://ocsforums.com/printthread.php?t=132 .
コメント

畜生、なんてこった! 文字通りすべて従ったが、404 Not Foundが表示されただけだった.. 来年もう一度試します。

返信: No such file or directory – /tmp/mysql.sock
database.ymlの中に、socketパラメータを追加し、mysqld.sockの正しいパスを書く必要があります。

development:
  adapter: mysql
  socket: /var/run/mysqld/mysqld.sock
  database: ficha_development
  username: carlos
  password:
  host: localhost

私は乱雑なステートメントに賛成します。最初にそれがどんなレベルか言うべきです。仮定も多すぎます。チュートリアルは文字通り従うことが期待されています。もし私がやるなら、エラーを取得します。

Ryan Hennigのコメント
http://localhost/friends/viewを表示したときに出たアプリケーションエラーを保存しました。development.logの中身は:

Recognition failed for "/view" 
/usr/local/lib/ruby/gems/1.8/gems/actionpack-1.12.1/lib/action_controller/routing.rb:488:in `recognition_failed'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-1.12.1/lib/action_controller/routing.rb:478:in `recognize!'
/usr/local/lib/ruby/gems/1.8/gems/rails-1.1.2/lib/dispatcher.rb:38:in `dispatch'
/usr/local/lib/ruby/gems/1.8/gems/rails-1.1.2/lib/fcgi_handler.rb:150:in `process_request'
/usr/local/lib/ruby/gems/1.8/gems/rails-1.1.2/lib/fcgi_handler.rb:54:in `process!'
/usr/local/lib/ruby/site_ruby/1.8/fcgi.rb:600:in `each_cgi'
/usr/local/lib/ruby/site_ruby/1.8/fcgi.rb:597:in `each_cgi'
/usr/local/lib/ruby/gems/1.8/gems/rails-1.1.2/lib/fcgi_handler.rb:53:in `process!'
/usr/local/lib/ruby/gems/1.8/gems/rails-1.1.2/lib/fcgi_handler.rb:23:in `process!'
/Users/rhennig/Rails/friends/public/dispatch.fcgi:24

前にも似たようなエラーが出ました。そこで、Tony ArnoldのページにあるRoRのセットアップの指図に従いましたが、まだ同じエラーが出ます。

Ryan Hennigのコメント
代わりにhttp://localhost/friends/friends/viewをブラウズすることでこれを解決しました。それから、tmp/sessionsのパーミッションを修正する必要がありました。