Skip to content

Instantly share code, notes, and snippets.

@budougumi0617
Last active August 29, 2015 14:00
Show Gist options
  • Save budougumi0617/11319731 to your computer and use it in GitHub Desktop.
Save budougumi0617/11319731 to your computer and use it in GitHub Desktop.
Study Ruby on Rails

#Ruby on Railsの孊習メモ

枅曞するたでメモ代わりに。

やったこず

vagrantでcentosサヌバを構築。
rbenv、rails環境構築。
vagrantディレクトリ以䞋にrailsプロゞェクト、/rails/helloworld蚭眮。

railsコマンドをzshが入力補完しおくれないので、zsh-completions導入

Sublime Text2の環境敎備

Simple Rails Navigator
viewディレクトリや、modelディレクトリをショヌトカットキヌから呌び出し、開くファむルを遞べる。かなり䟿利
https://github.com/noklesta/SublimeRailsNav/

SublimeERB
.erbファむル䞊で<% %>などのrailsタグを挿入できる。 https://github.com/eddorre/SublimeERB

Auto Encording for Ruby

SublimeLinter
゚ラヌ衚瀺
https://github.com/SublimeLinter/SublimeLinter

keybind曎新

#Default (OSX).sublime-keymap
// for Emmet command.
{
    "keys": [
    "super+e"
    ],
    "args": {
        "action": "expand_abbreviation"
        },
        "command": "run_emmet_action",
        "context": [
        {
            "key": "emmet_action_enabled.expand_abbreviation"
        }
        ]
        },
/*
 * Setting for SublimeERB
 * Now you can use ctrl+shift+. to create and toggle between ERB tags.
 * NOTE: On a Mac use the command key for the ctrl key.
 */
 { "keys": ["ctrl+shift+."], "command": "erb" },
 /*
  * Setting for Simple Rails Navigator
  */
 { "keys": ["super+ctrl+m"], "command": "list_rails_models" },
 { "keys": ["super+ctrl+c"], "command": "list_rails_controllers" },
 { "keys": ["super+ctrl+v"], "command": "list_rails_views" },
 { "keys": ["super+ctrl+h"], "command": "list_rails_helpers" },
 { "keys": ["super+ctrl+x"], "command": "list_rails_fixtures" },
 { "keys": ["super+ctrl+t"], "command": "list_rails_tests" },
 { "keys": ["super+ctrl+i"], "command": "list_rails_javascripts" },
 { "keys": ["super+ctrl+y"], "command": "list_rails_stylesheets" },
 /*
  *  Edit - Line - Reindent
  */
 { "keys": ["super+alt+r"], "command": "reindent" , "args": { "single_line": false } }

#進捗状況 技術曞孊習進捗状況

Ruby on Rails 4 アプリケヌションプログラミング http://amazon.jp/dp/4774164100


04/26

P40皋床たで孊習。

  • route.rbの倉曎を忘れないようにしないず衚瀺されない。
  • rails generate controller helloでhelloアクションメ゜ッドを䜜成
  • rails generate controller hello viewでhelloアクションメ゜ッドのviewずいうアクションずビュヌを䜜成できる。
  • ロヌカル環境ならばファむル曎新するたびにrails serverしなくおも自動反映されおいる。
  • Sublime Text2(ST2)䞊でCtrl + Shift + .コマンドでerbファむルにRubyスクリプト埋め蟌み甚ブロックを挿入できる。
  • ST2でEmmetはsuper + eコマンド。
  • ST2でapps以䞋の各ディレクトリのファむルを芗くずきはsuper + ctrl + vずか

postgres䞊のナヌザpsqlを䜿う際ずしお暩限があるのか確認するこずが特に倧事。

Postgresql 9.3 をcentos6にむンストヌル
http://blog.myspoon.info/2013/12/postgresql-93-centos6.html

RubyonRailsでsqliteでなくおPostgresqlを䜿う時
http://www.workabroad.jp/posts/1079

postgresXX-serverなどがpostgresXX-develずかなしでむンストヌルできるが、そこで無芖するずGemのむンストヌルでハマる。。。

gem install pgで゚ラヌ  めっちゃはたった。
http://ameblo.jp/markein/entry-10731212608.html

明日詊したいや぀
#342 Migrating to PostgreSQL
http://railscasts.com/episodes/342-migrating-to-postgresql?language=ja&view=asciicast


04/27

postgreSQLはドハマりしたので、ずりあえず保留。 䞀応起動たではできおいる。LDAPなどの認蚌のように、DBのアカりントずサヌバアカりントが異なるこず、かなりの䟝存パッケヌゞが倚いので起動させるのも難しい。

DBの初回蚭定は以䞋。modelをgenerateするこずを宣蚀し、第二匕数に定矩するテヌブル名book)、あずはjson圢匏で芁玠名:属性を぀ら぀ら曞いおいく。

rails generate model book isbn:string title:string price:integer ....
localhost [vagrant@04:58:51] rails generate model book isbn:string title:string price:integer publish:string published:date cd:boolean
      invoke  active_record
      create    db/migrate/20140427045906_create_books.rb
      create    app/models/book.rb
      invoke    test_unit
      create      test/models/book_test.rb
      create      test/fixtures/books.yml

実行するず自動的に耇数の蚭定ファむルが生成される。

class CreateBooks < ActiveRecord::Migration
  def change #auto create
    create_table :books do |t|
      t.string :isbn
      t.string :title
      t.integer :price
      t.string :publish
      t.date :published
      t.boolean :cd

      t.timestamps
    end
  end
end

その埌は以䞋のコマンドでDBにテヌブル䜜成。

rake db:migrate

テストファむルからダミヌデヌタを流しこむずきは以䞋のコマンド

rake db:fixtures:load FIXTURES=books

デヌタベヌスの䞭身を確認するデヌタベヌスクラむアントもある。

localhost [vagrant@05:51:30] rails dbconsole               [~/rails/helloworld]
SQLite version 3.6.20
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .tables
books              schema_migrations
sqlite> .schema books
CREATE TABLE "books" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "isbn" varchar(255), "title" varchar(255), "price" integer, "publish" varchar(255), "published" date, "cd" boolean, "created_at" datetime, "updated_at" datetime);
sqlite> SELECT * FROM books
   ...> ;
1|978-4-7741-5878-5|Android゚ンゞニアのためのモダンJava|3360|技術評論瀟|2013-08-20|f|2014-04-27 05:36:09|2014-04-27 05:36:09
2|978-4-7741-5611-8|JavaScriptラむブラリ実践掻甚|2709|技術評論瀟|2013-03-19|f|2014-04-27 05:36:09|2014-04-27 05:36:09
3|978-4-7741-4980-6|Ruby on Rails 4ポケットリファレンス|2919|技術評論瀟|2012-01-26|t|2014-04-27 05:36:09|2014-04-27 05:36:09
4|978-4-8222-9621-6|曞き蟌み匏SQLのドリル|2310|日経BP瀟|2013-04-22|t|2014-04-27 05:36:09|2014-04-27 05:36:09
5|978-4-7980-3585-7|はじめおのAndroidアプリ開発|3150|秀和システム|2012-11-22|f|2014-04-27 05:36:09|2014-04-27 05:36:09
6|978-4-7981-2631-9|10日でおがえるPHP入門教宀|3360|翔泳瀟|2012-09-13|t|2014-04-27 05:36:09|2014-04-27 05:36:09
7|987-4-8222-9612-4|アプリを䜜ろうHTML5入門|1995|日経BP瀟|2012-06-07|f|2014-04-27 05:36:09|2014-04-27 05:36:09
8|978-4-7741-5067-3|HTML5 開発ポケットリファレンス|2709|翔泳瀟|2012-04-17|f|2014-04-27 05:36:09|2014-04-27 05:36:09
9|978-4-7981-3049-1|独習Java サヌバサむド線|3780|翔泳瀟|2013-01-28|f|2014-04-27 05:36:09|2014-04-27 05:36:09
10|978-4-88337-774-9|Flash CSで孊ぶ iPhone実践プログラミング|2625|゜シム|2011-08-16|f|2014-04-27 05:36:09|2014-04-27 05:36:09
sqlite> SELECT title FROM books;
Android゚ンゞニアのためのモダンJava
JavaScriptラむブラリ実践掻甚
Ruby on Rails 4ポケットリファレンス
曞き蟌み匏SQLのドリル
はじめおのAndroidアプリ開発
10日でおがえるPHP入門教宀
アプリを䜜ろうHTML5入門
HTML5 開発ポケットリファレンス
独習Java サヌバサむド線
Flash CSで孊ぶ iPhone実践プログラミング

EmacsはCtrl + alt + *で単語移動ができる。

1.4 Emacsの基本的な操䜜
http://cns-guide.sfc.keio.ac.jp/2000/4/1/4.html

DBにアクセスしたずきはログで発行されたSQL文を確認できる。

Started GET "/hello/list" for 192.168.33.1 at 2014-04-27 06:30:50 +0000
Processing by HelloController#list as HTML
  Book Load (9.4ms)  SELECT "books".* FROM "books"
  Rendered hello/list.html.erb within layouts/application (20.2ms)
Completed 200 OK in 456ms (Views: 443.2ms | ActiveRecord: 11.2ms)

アプリの実行環境を倉曎したいずき

蚭定ファむルを線集しなくおもrails serverコマンドのオプションで倉曎できる

  • -p 䜿甚するポヌト番号を倉曎する。
  • -b バむンドするIPアドレスデフォルトは0.0.0.0
  • -d デヌモンずしおサヌバを起動
  • -e 特定の環境test, development, production)でサヌバを起動デフォルトはdevelopment
  • -P PIDファむルデフォルトはtmp/pids/server.pid
  • -h ヘルプを衚瀺

第䞉章

Scaffoldingコマンドを利甚するこずでCRUD(Create-Read-Update-Delete)を備えたペヌゞを簡単に䜜成するこずができる。 CRUDを備えたbooksテヌブルを䜜成したい䟋。

rails generate scaffold book isbn:string title:string price:integer publish:string published:date cd:boolean

routes.rbの倉曎も自動的に行なっおくれるので、ペヌゞ配眮も完了しおいる。
ペヌゞのURL配眮は**rake routes**コマンドで簡単に確認するこずができる。

localhost [vagrant@08:21:19] rake routes             [~/share/rails/helloworld]
    Prefix Verb           URI Pattern                            Controller#Action
     books GET            /books(.:format)                       books#index
           POST           /books(.:format)                       books#create
  new_book GET            /books/new(.:format)                   books#new
 edit_book GET            /books/:id/edit(.:format)              books#edit
      book GET            /books/:id(.:format)                   books#show
           PATCH          /books/:id(.:format)                   books#update
           PUT            /books/:id(.:format)                   books#update
           DELETE         /books/:id(.:format)                   books#destroy
hello_show GET            /hello/show(.:format)                  hello#show
           GET|POST|PATCH /:controller(/:action(/:id))(.:format) :controller#:action
```
`books(.:format) `はフォヌマットを省略しおアクセスしおも補完しおくれるずいうこず。  
`http://localdev:3000/books`ずアクセスするずデフォルトで補完するので、`http://localdev:3000/books.html`にアクセスしたこずになる。  
scaffoldはjson.builderも生成しおくれるので、`http://localdev:3000/books.json`ずアクセスするず、**ERBを利甚しお、JSON圢匏の出力を生成する**。

4/28

フォヌム関連のビュヌヘルパヌ

Railsでは、アクションメ゜ッドが存圚しない堎合、テンプレヌトファむルを盎接芋に行く

フォヌム生成の基瀎

タグを生成するためのフォヌム生成ヘルパヌが皮類、個別の入力フィヌルドを生成するためのフォヌム芁玠生成ヘルパヌが皮類に分類できる。

䟋

<%= form_tag({ controller: :keyword, action: :search },
   id: :fm, class: :search) do %> <%# form_tagでフォヌム生成 %>
  怜玢キヌワヌド
  <%= text_field_tag :keywd, '', size: 30 %><%# フォヌム芁玠生成 %>
  <%= submit_tag '怜玢' %>
<% end %>

form_tagメ゜ッド内はクラスが特定できないので、Form_tagヘルパヌ(読み蟌み甚)ずFormヘルパヌ線集甚しか䜿えない。
form_forメ゜ッド内はクラスが特定されるので、Form_tagヘルパヌ(読み蟌み甚)ずf.Formヘルパヌ線集甚が䜿える。Formヘルパヌも䜿おうず思えば䜿える。

Rails4からxxxx_methodヘルパヌには、url_fieldなどのHTML5に察応枈みのビュヌヘルパヌも存圚する。HTML5に察応しおいないブラりザでも、暙準的なテキストボックスずしお衚瀺されるだけで、゚ラヌずなるわけではないので、積極的に䜿うべきである。

  def col_select
    @book = Book.new(publish: '技術評論瀟') #"技術評論瀟"が入った噚を䜜成。
    @books = Book.select(:publish).distinct
  end

  def col_select2
    @book = Book.new(publish: '技術評論瀟')
    @books = Book.select('DISTINCT publish')
  end

SQLでSELECT DISTINCT publish from booksずしおいるむメヌゞ。

formはキリがないので、メモは割愛。

アプリケヌション共通のデザむンを定矩する-レむアりト

P172 レむアりトに耇数のコンテンツ領域を蚭眮する

デフォルトのレむアりト(application.html.erb)では、初期状態でコンテンツ領域をひず぀だけしか持っおいたせん。しかし、時ずしお耇数のコンテンツ領域を持ちたいずいうこずもある。その堎合は、<%=yield %>を耇数埋め蟌む

#layout.html.erb
<!DOCTYPE html>
<html>
<head>
  <title><%= @title ? @title : 'Rails入門' %></title>
  <%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true %>
  <%= javascript_include_tag "application", "data-turbolinks-track" => true %>
  <%= csrf_meta_tag %>
</head>
<body>
 <%= yield :extend_menu %> <%# コンテンツ名:extended_menuで远加%>
<hr />
...その他の固定コンテンツ...
<hr />
<%= yield %> <%# デフォルトのコンテンツ名は:layout省略されおいる%>
</body>
</html>
#views_contoroller.rb
def multi
  render layout: 'layout' # レむアりトlayout.html.erbを適甚
end
#view/multi.html.erb
<% content_for :extend_menu do %> <% ここから:extend_menu %>
<%= link_to '関連情報', action: :relation %>
<%= link_to 'ダりンロヌド', action: :download %>
<%= link_to 'アンケヌト', action: :quest %>
<% end %> <% ここたで:extend_menu %> 
<% content_forで䜕も指定しないずデフォルトのyieldに蚘述される %>
<div id="main">
  ...コンテンツ本䜓...
</div>

P174 レむアりトを入れ子に配眮する

以䞋のようなヘッダヌ/フッタヌ郚分は共通だが、メニュヌ郚分はペヌゞごずに異なるペヌゞレむアりトを考える。  

http://www.saitama-u.ac.jp/society/index.html
http://www.saitama-u.ac.jp/education/index.html

このようなケヌスで、それぞれのペヌゞレむアりトに共通のヘッダデザむンたで持たせるのは望たしくない。ヘッダデザむンに倉曎が生じた堎合、党おのレむアりトを修正する必芁があるためである。
このような堎合には、レむアりトを入れ子にするこずで、ヘッダ郚分を䞀぀のレむアりトずしお管理する。

view_controller.rb
# encoding: utf-8
class ViewController < ApplicationController
  def nest 
    @msg = '今日も良い倩気です。'
    render layout: 'child' #viewモデルのnestアクションのレむアりトはchild
  end
end
view/nest.html.erb
<%= @msg %>
layouts/child.html.erb
<%#
コンテンツをcontent_forメ゜ッドで明瀺的に定矩する。
テンプレヌトnest.html.erbで既にデフォルトのコンテンツ:layoutが
暗黙的に䜿われおしたっおいるので、区別するために:contentコンテンツを定矩しおいる。
:contentコンテンツの配䞋では、コンテンツ:layoutコンテンツをむンクルヌドするためのyieldメ゜ッドを呌び出す。
%>
<% content_for :content do %>
<img src="http://www.wings.msn.to/image/wings.jpg" />
<hr />
<%= yield %>
<hr />
Copyright 1998-2013, YAMADA,Yoshihiro
<% end %>
<%#
レむアりトをネストさせるために必芁な蚘述。子レむアりトchild.html.erbから
芪レむアりトapplication.html.erbを呌び出すためには、renderメ゜ッドの
templateオプションを利甚しお、明瀺的に呌び出す必芁がある。
%>
<%= render template: 'layouts/application' %>
#layouts/application.html.erb
<!DOCTYPE html>
<html>
<head>
  <title><%= @title ? @title : 'Rails入門' %>
  <%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true %>
  <%= javascript_include_tag "application", "data-turbolinks-track" => true %>
  <%= csrf_meta_tags %>
</head>
<body>

<%# 
content_for?メ゜ッドは指定されたコンテンツが存圚するかどうかを刀定する。
ここではcontent_for?メ゜ッドで:contentコンテンツが存圚するかを確認し、存圚した堎合は:contentコンテンツを、そうでない堎合は通垞の:layoutコンテンツを呌び出す。
%>
<%= content_for?(:content) ? yield(:content) : yield %> 

</body>
</html>

簡単にたずめるず、入れ子のレむアりトは

  • 子レむアりトから芪レむアりトの呌び出し
  • 芪レむアりト→:contentコンテンツ→:layoutコンテンツの呌び出し

によっお実珟しおいるにすぎない。
サンプルでは階局のレむアりトを実装しおいるが、理屈䞊は階局以䞊のレむアりトを定矩するこずも可胜。ただしRailsはネストするレむアりトを本質的な意味で察応しおいるわけではない。

P228 怜蚌機胜の実装

怜蚌機胜を利甚するのはさほど難しいこずではない。

モデルクラスに怜蚌ルヌルを定矩する。

怜蚌ルヌルはモデルクラスここれはbook.rbに宣蚀するのが基本になる。

#book.rb
class Book < ActiveRecord::Base
  validates :isbn,
    presence: true,
    uniqueness: true,
    # uniqueness: { allow_blank: true },
    length: { is: 17 },
    # length: { is: 17 , allow_blank: true },
    format: { with: /\A[0-9]{3}-[0-9]{1}-[0-9]{3,5}-[0-9]{4}-[0-9X]{1}\z/ }
    # format: { with: /\A[0-9]{3}-[0-9]{1}-[0-9]{3,5}-[0-9]{4}-[0-9X]{1}\z/, allow_blank: true }
    # isbn: true
    # isbn: { allow_old: true }

ここでは、それぞれのフィヌルド単䜍にvalidatesメ゜ッドを呌び出しおいるが、 「validates :first_name, :last_name, ...」のように耇数のフィヌルドに察しお たずめお怜蚌ルヌルを適甚するこずもできる。耇数のフィヌルドが同䞀の怜蚌ルヌル を持぀堎合には、このように蚘述したほうが、コヌドはシンプルになる。
匕数nameずparamsには怜蚌ルヌルをハッシュ圢匏で指定する。 怜蚌パラメヌタ匕数rparamsが䞍芁である堎合には、怜蚌を有効にする意味で trueずのみ指定する。

怜蚌を実行する

怜蚌はデヌタの保存時に自動的に行われるため、基本的に アプリケヌション偎ではあたり意識するこずではない。
任意のタむミングで怜蚌凊理を行うには、valid?メ゜ッドを利甚するこずで、 デヌタベヌスの保存ずは別に怜蚌凊理だけを独立しお行うこずもできる。

P250 ア゜シ゚ヌションによる耇数テヌブルの凊理

**ア゜シ゚ヌション関連**ずは、テヌブル間のリレヌションシップをモデル䞊の 関係ずしお操䜜できるようにするしくみのこず。 関連を利甚するこずで、耇数のテヌブルにたたがるデヌタ操䜜もより盎感的に 利甚できるようになる。

booksテヌブル

id isbn title ... cd
1 1234-... タむトル ... false
2 1234-... タむトル ... false
... ... ... ... ...
10 1234-... タむトル ... false

reviewsテヌブル

id book_id user_id body
1 1 2 コメント
... ... ... ...
3 2 4 コメント
4 3 3 コメント
5 1 5 コメント

件の曞籍情報(booksテヌブル)に察しお、耇数のレビュヌ(reviewテヌブル)が結び぀いおいる関係を䟋にする。曞籍情報ずレビュヌの察応関係は、booksテヌブルのid列ずreviewsテヌブルのbooks_id列によっお衚珟しおいる。 books.id列は曞籍情報を䞀䜍に識別するための䞻キヌ いわゆる曞籍情報の背番号になる。reviews.book_id列には、このbooks.id列に察応する倀をセットするこずで、 どの曞籍情報に察応しおいるかを衚すこずができる。この党な参照キヌのこずを倖郚キヌず呌ぶ。
このようあ関係にあるテヌブルから「id=1である曞籍に属するレビュヌを取埗」するにはどうしたらいいか。冗長に曞くならば以䞋のようになる。

@book = Book.find(1)
@reviews = Review.where(book_id: @book.id)

しかし、ア゜シ゚ヌションを利甚するこずで、以䞋のように蚘述できるようになる。

@book = Book.find(1)
@review = @book.reviews

いちいち䞻キヌ/倖郚キヌを意識しお、条件匏を蚘述しなければならなかった前者に比べるず、埌者がごく盎感的なコヌドであるこずがわかる。

リレヌションシップず呜名芏則

だいたいこんな感じ

http://www.stonedot.com/lecture6.html

P275 コヌルバック

**コヌルバックコヌルバックメ゜ッド**ずは、Active Recordによる怜玢、登録、曎新、削陀、および、怜蚌凊理のタむミングで実行されるメ゜ッドのこず。 たずえば、

  • ナヌザ情報を登録する際にパスワヌドが指定されおいなかったら、ランダムのパスワヌドを生成
  • 曞籍情報を削陀するさいに、削陀される曞籍情報を履歎情報ずしお蚘録する
  • 著者情報が登録/曎新されたタむミングで、管理者にメヌルを送信

など、モデル操䜜のタむミングでたずめお実行スべき凊理は、コヌルバックずしお定矩するこずで、同じようなコヌドがモデルやコントロヌラに分散するのを防げる。
たた、Active Recordは、実際の保存凊理ずコヌルバックずをひず぀のトランザクションずしお実行する。コヌルバックを利甚するこずで、関連するひず぀らなりの凊理を トランザクションを意識するこず無く蚘述できるメリットもある。

マむグレヌション

Railsでは、テヌブルレむアりトを䜜成、倉曎するためのしくみずしお、マむグレヌションずいう機胜を提䟛しおいる。Migration(移行)ずいう名前の通り、マむグレヌション機胜は開発途䞭でのスキヌマの倉化に際しお進化を発揮する。

P283 マむグレヌションファむルの䜜成

マむグレヌションファむルを䜜成する方法は、以䞋の皮類に倧別できる。

  1. rails generate modelコマンドでモデルに合わせお䜜成する。
  2. rails generate migrationコマンドを䜿っおマむグレヌションファむル単䜓で䜜成する。

新芏にテヌブルを䜜成する堎合には、1.でモデルもろずも䜜成するのが手軜。 既に存圚するテヌブルに察しお、レむアりトの修正を行いたい堎合には、2.の方法を利甚する。

0428 その2

P299 コントロヌラ開発

P394 テスト

Railsでは以䞋のテストの皮類に察応しおいる。

テスト名 抂芁
Unitテスト モデルやビュヌヘルパヌ単䜍の動䜜をチェック
Functoinalテスト コントロヌラ/テンプレヌトの呌び出し結果をチェック
ステヌタスコヌドやテンプレヌト倉数、ビュヌによる出力結果など
Integrationテスト 耇数のコントロヌラにたたがるナヌザの実際の操䜜に沿った挙動の成吊をチェック

テスティングフレヌムワヌクずしおはTest::UnitやRSpecラむブラリが䞀般的。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment