document

注意:これはrails2の時に書いたものです。rails3ではコマンドが変わっています。

script/generate xxxxxxxxxx

がrails3では

rails generate xxxxxxxx

と変わっている

Level1以降のリファレンスサイトではすでにrails3仕様で書かれています。

Ruby on Rails Guides: Getting Started with Rails http://guides.rubyonrails.org/getting_started.html

Level0:1分でblog作成(sqlite)

Ruby on Rails - ActiveRecord? - ― ありえるえりあ <http://dev.ariel-networks.com/articles/workshop/rails-activerecord>

からのコピー

$ rails myblog
$ cd myblog
$ script/generate scaffold Article title:string body:text
$ rake db:migrate
$ script/server

Level1:Ruby on Rails guidesのチュートリアル

http://guides.rubyonrails.org/getting_started.html

にある公式チュートリアルです。チュートリアルで結構はまった
一通りrailsのことが理解できて、一番まとまっている。

ハテブでも評判がよく、
http://b.hatena.ne.jp/entry/guides.rubyonrails.org/

日本語訳もすすんでいるようだ
翻訳プロジェクト:RailsGuide?日本語翻訳 すこしづつ翻訳 <http://honyaku.ssktkr.com/projects/docrails/documents>

1 This Guide Assumes

2 What is Rails?

2章はRailsについて、MVCやRESTやCRUDについて解説

3 Creating a New Rails Project

3章からプロジェクトを作る

3.1 Installing Rails

3.2 Creating the Blog Application

$ rails blog

ここで、生成されるファイルの場所と機能について説明がある。

3.3 Configuring a Database

今はデフォルトでSQLiteなので、とくに設定の変更は必要なかった

3.4 Creating the Database

$cd blog

今後はこのディレクトリで作業やコマンドを発行する。

$ rake db:create

このコマンドでDBが作られる。

blog/dbに"development.sqlite3"が作られる

4 Hello, Rails!

Hello, Rails!プロジェクトを作る

$ script/generate controller home index 

このコマンドでコントローラーを作る

出力:

     exists  app/controllers/
     exists  app/helpers/
     create  app/views/home
     exists  test/functional/
     create  test/unit/helpers/
     create  app/controllers/home_controller.rb
     create  test/functional/home_controller_test.rb
     create  app/helpers/home_helper.rb
     create  test/unit/helpers/home_helper_test.rb
     create  app/views/home/index.html.erb

4.1 Starting up the Web Server

$ script/server 

でWEBサーバー機動

http://localhost:3000

にアクセスするとデフォルトのページが表示される。

自分が作ったページは

http://localhost:3000/home/index

4.2 Setting the Application Home Page

デフォルトのページを自分が作ったページにする。

  • 1.デフォルトページを削除する
    $ rm public/index.html 
  • 2. config/routes.rbの変更
     map.connect ':controller/:action/:id'
     map.connect ':controller/:action/:id.:format'
    #この下に一行追加
    map.root :controller => "home" 
  • routes.rbについて
    This is your application’s, routing file, which holds entries in a special DSL (domain-specific language) that tells Rails how to connect incoming requests to controllers and actions. At the bottom of the file you’ll see the default routes:

これで

http://localhost:3000

にアクセスすると自分が生成したページが表示されている。

5 Getting Up and Running Quickly With Scaffolding

Scaffoldはマジで便利です!!

Rails scaffolding is a quick way to generate some of the major pieces of an application.
If you want to create the models, views, and controllers for a new resource in a single operation, scaffolding is the tool for the job.

6 Creating a Resource

ここからいよいよブログのコアとなるものを作っていく。

$ script/generate scaffold Post name:string title:string content:text 

scaffoldでMVCが作られるし、CRUDのviewもできている。

  • 生成されたファイルの場所と解説
    	File  	:Purpose
    	app/models/post.rb 	:The Post model
    	db/migrate/20090113124235_create_posts.rb 	:Migration to create the posts table in your database (your name will include a different timestamp)
    	app/views/posts/index.html.erb :	A view to display an index of all posts
    	app/views/posts/show.html.erb 	:A view to display a single post
    	app/views/posts/new.html.erb :	A view to create a new post
    	app/views/posts/edit.html.erb 	:A view to edit an existing post
    	app/views/layouts/posts.html.erb 	:A view to control the overall look and feel of the other posts views
    	public/stylesheets/scaffold.css 	:Cascading style sheet to make the scaffolded views look better
    	app/controllers/posts_controller.rb 	:The Posts controller
    	test/functional/posts_controller_test.rb 	:Functional testing harness for the posts controller
    	app/helpers/posts_helper.rb 	:Helper functions to be used from the posts views
    	config/routes.rb 	:Edited to include routing information for posts
    	test/fixtures/posts.yml 	:Dummy posts for use in testing
    	test/unit/post_test.rb 	:Unit testing harness for the posts model
    	test/unit/helpers/posts_helper_test.rb 	:Unit testing harness for the posts helper

6.1 Running a Migration

データベースの定義は

db/migrate/20090113124235_create_posts.rb

に入っている。ファイルにはタイムスタンプが添付されている。

コードの説明は本家を参照

$ rake db:migrate 

rakeコマンドでmigrationをするテーブルをつくる感じ?

6.2 Adding a Link

railsでのリンク追加の書式の説明

3章で作った。デフォルトページ

/app/views/home/index.html.erb

<h1>Hello, Rails!</h1> 
<%= link_to "My Blog", posts_path %> 

のようにリンクを追加する。

6.3 Working with Posts in the Browser

そうするとデフォルトページにリンクができて、

http://localhost:3000/posts

に飛ぶようになる。

6.4 The Model

MVCのMのコードの説明

6.5 Adding Some Validation

postのモデルを規程するファイル

app/models/post.rb

にコードを足して、

バリデーションの追加(エラーチェック)、これも非常に便利!

	class Post < ActiveRecord::Base
	#この2行を追加
	 validates_presence_of :name, :title  
	 validates_length_of :title, :minimum => 5 
	end

6.6 Using the Console

コンソールでもテストできますよ

6.7 Listing All Posts

コントローラーの説明

app/controllers/posts_controller.rb

を見てみる。

http://localhost:3000/posts.xml

にアクセスするとXML形式で表示される。

6.8 Customizing the Layout

app/views/layouts/posts.html.erb

で全体的なレイアウトを変更することができる。

6.9 Creating New Posts

6.10 Showing an Individual Post

6.11 Editing Posts

6.12 Destroying a Post

6.9〜6.12は登録、表示、編集、削除のcontrollerとVIEWの説明

7 DRYing up the Code

Don't repeat yourselfな工夫

7.1 Using Partials to Eliminate View Duplication

newとeditのformの部分が重複しているので、_form.html.erbに統合する方法。

  • new.html.erb:
    	<h1>New post</h1>
    	<%= render :partial => "form" %> 
    	<%= link_to 'Back', posts_path %>
  • edit.html.erb:
    	<h1>Editing post</h1>
    	<%= render :partial => "form" %>
    	<%= link_to 'Show', @post %> |
    	<%= link_to 'Back', posts_path %>
  • _form.html.erb:
    	<% @post.tags.build if @post.tags.empty? %> 
    	<% form_for(@post) do |post_form| %>
    	 <%= post_form.error_messages %>  
    	<p> 
    	 <%= post_form.label :name %><br /> 
    	 <%= post_form.text_field :name %> 
    	</p>  
    	<p>
    	  <%= post_form.label :title, "title" %><br />
    	  <%= post_form.text_field :title %>  
    	</p>  
    	<p>
    	  <%= post_form.label :content %><br />
    	  <%= post_form.text_area :content %>  
    	</p>  
    	<p>
    	  <%= post_form.submit "Save" %>  
    	</p> 
    	<% end %>

7.2 Using Filters to Eliminate Controller Duplication

postのcontrollerで一つの機能に付き、一行

@post = Post.find(params[:id])

を書かないといけない。

これをFilterを使って、一行で済むようにする(やらなくても次いける)

8 Adding a Second Model

次のモデルはScaffoldなしで手作業で作る。そのためスペルミスや構文エラーが頻発する。

8.1 Generating a Model

$ script/generate model Comment commenter:string body:text post:references

post:referencesと書くとpostに属するモデルということになる。

「postが複数のCommentをもってもいい(has many)」
   *  Each comment belongs to one post
   * One post can have many comments

っ手感じ,

その後

$ rake db:migrate

として、テーブルを作る

8.2 Associating Models

モデルのpost.rbにcommentモデルを記述する。

	class Post < ActiveRecord::Base
	 validates_presence_of :name, :title  
	 validates_length_of :title, :minimum => 5 
	#この1行を追加
	 has_many :comments
	end

8.3 Adding a Route

config/routes.rbの変更 一番上の方に、

 map.resources :posts

とあるので、これを

map.resources :posts, :has_many => :comments 

に書き換える

8.4 Generating a Controller

$ script/generate controller Comments index show new edit

でコントローラーを作る。その後作られたcontrollerを編集。

コードが最終版のコードを張り付けます。コードが合わなくてエラーになるかもしれません。

	class CommentsController < ApplicationController
	  def index
		@post = Post.find(params[:post_id])
		@comments = @post.comments
	  end
	  def show
		@post = Post.find(params[:post_id])
		@comment = @post.comments.find(params[:id])
	  end
	  def new
		@post = Post.find(params[:post_id])
		@comment = @post.comments.build
	  end
	  def create
		@post = Post.find(params[:post_id])
		@comment = @post.comments.build(params[:comment])
		if @comment.save
			redirect_to post_comment_url(@post,@comment)
		else
			render :action => "new"
		end
	  end
	  def edit
	  	@post = Post.find(params[:post_id])
		@comment = @post.comments.find(params[:id])
	  end
	  def update
		@post = Post.find(params[:post_id])
		@comment = @post.find(params[:id])
		if @comment.update_attributes(params[:comment])
			redirect_to post_comment_url(@post,@comment)
		else
			render :action => "edit"
		end
	  end
	  def destroy 
		@post = Post.find(params[:post_id])  
		@comment = Comment.find(params[:id])  
		@comment.destroy 
		respond_to do |format| 
			format.html { redirect_to post_comments_path(@post) } 
			format.xml { head :ok } 
		end  
	  end 
	end

8.5 Building Views

Viewを書く

大変なんで本家を参考に

8.6 Hooking Comments to Posts

views/posts/show.html.erb

にcommentを追加する.本家を参考に

<h1>Comment on <%= @post.title %></h1> <p>  <b>Commenter:</b>  <%=h @comment.commenter %> </p> <p>  <b>Comment:</b>  <%=h @comment.body %> </p> <%= link_to 'Edit', edit_post_comment_path(@post, @comment) %> | <%= link_to 'Back', post_comments_path(@post) %>

この後に

$ rake db:migrate 

でうまく機動するかもしれない

9 Building a Multi-Model Form

二つのform(postにtag)を一つにまとめて表示できるようにする

  • 1.まずtagというモデルを作る
    $ script/generate model tag name:string post:references
  • 2.その後でテーブルを作る
    $ rake db:migrate 
  • 3.その後にモデルのpost.rbを書き換える
    	class Post < ActiveRecord::Base
    		validates_presence_of :name, :title
    		validates_length_of :title,:minimum => 5
    	 	has_many :comments
    		#この3行を追加
    		has_many :tags
    		accepts_nested_attributes_for :tags, :allow_destroy => :true ,  
    		:reject_if => proc { |attrs| attrs.all? { |k, v| v.blank? } } 
    	end
  • 4. views/posts/_form.html.erb も変更する必要がある
    	<% @post.tags.build if @post.tags.empty? %> 
    	<% form_for(@post) do |post_form| %>
    	 <%= post_form.error_messages %>  
    	<p> 
    	 <%= post_form.label :name %><br /> 
    	 <%= post_form.text_field :name %> 
    	</p>  
    	<p>
    	  <%= post_form.label :title, "title" %><br />
    	  <%= post_form.text_field :title %>  
    	</p>  
    	<p>
    	  <%= post_form.label :content %><br />
    	  <%= post_form.text_area :content %>  
    	</p>  
    	<h2>Tags</h2>  
    	<% post_form.fields_for :tags do |tag_form| %>  
    		<p>
    		  <%= tag_form.label :name, 'Tag:' %>  <%= tag_form.text_field :name %>  
    		</p>  
    		<% unless tag_form.object.nil? || tag_form.object.new_record? %>  
    			<p>
    			  <%= tag_form.label :_delete, 'Remove:' %>  
    			  <%= tag_form.check_box :_delete %>  
    			</p>  
    		<% end %>  
    	<% end %> 
    	<p>
    	  <%= post_form.submit "Save" %>  
    	</p> 
    	<% end %>
  • 5サーバー起動
    $ script/server
    でうまくいくと思う!

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-01-13 (木) 21:28:26 (3075d)