remotelocal / web

0 stars 0 forks source link

今更だがRailsチュートリアルを読む。 #12

Open remotelocal opened 9 years ago

remotelocal commented 9 years ago

読み終わったら次はこれがおすすめらしい。

最後に、Ruby on Railsチュートリアルを読み終えた経験豊富なプログラマの方には、さらに高度な話題を扱っている「The Well-Grounded Rubyist」(David A. Black 著) または「Eloquent Ruby」(Russ Olsen 著) をお勧めします。あるいは、トピック別に書かれている「The Ruby Way」(Hal Fulton 著) を読んでみるのも良いでしょう。

remotelocal commented 9 years ago
RailsCasts (Ryan Bates) : 極めて質の高い (ほぼ) 無料のスクリーンキャスト
PeepCode: 質の高い商用のスクリーンキャスト
Code School: プログラミングを対話的に学習できるコース
Rails Guides: トピック毎に分類された最新の Rails リファレンス (日本語版: Railsガイド)
RailsCasts (Ryan Bates): さっきも RailsCasts を紹介しましたっけ?そのぐらい RailsCasts はお勧めです。
remotelocal commented 9 years ago

Ruby Mineでrails チュートリアルをやるための設定 https://github.com/perfectionist/sample_project/wiki

remotelocal commented 9 years ago

~/.gemrc

install: --no-rdoc --no-ri
update:  --no-rdoc --no-ri

gem installの際ドキュメントを無視できる

remotelocal commented 9 years ago

あっ でもそしたらDashでgemのダウンロードできなくなっちゃうかも。

remotelocal commented 9 years ago

Gemfileについて

=と書くとbundle installの実行時に必ずアップグレードが行われますが、~> 4.0.0と書くとマイナーなアップグレードしか行われないことになります

remotelocal commented 9 years ago

gitのalias

git config --global alias.co checkout
remotelocal commented 9 years ago

手順の最後として、Gitのコミットメッセージを入力するときに使用するエディタを設定できます。Sublime Text、TextMate、gVim、MacVimなどのGUIエディタを使用する場合、シェルから離れずシェル内で起動するようフラグを付けてください16。

$ git config --global core.editor "subl -w"

"subl -w" の部分は、TextMateの場合は "mate -w"、gVimの場合は"gvim -f"、MacVimの場合は"mvim -f" にそれぞれ置き換えます。

remotelocal commented 9 years ago

rails_12factor gemが追加されている点に注目してください。これは画像やスタイルシートなどの静的なアセットを提供するためにHerokuで使用されます。

remotelocal commented 9 years ago

--without productionオプションを追加すると、 本番用のgem (この場合はpgとrails_12factor) はローカルの環境にはインストールされません (Bundlerでreadlineエラーが発生した場合は、Gemfileにgem ’rb-readline’を追加してください)。上で追加したgemは本番環境のみで使用するためのものなので、このコマンドを今実行してもgemはローカルに追加されません。このコマンドを実行するのは、後の本番環境に備えてGemfile.lockを更新し、pg gemとrails_12factor gem、Rubyバージョンの指定を含めておく必要があるためです。以下を実行して変更をコミットできます。

remotelocal commented 9 years ago

第一章読破。30~40分くらいかな?

remotelocal commented 9 years ago

(第1章でも書きましたが、Bundlerでreadlineエラーが発生した場合は、Gemfileにgem ’rb-readline’を追加してください)。

remotelocal commented 9 years ago

現在のGemfileに対応するバージョンのRakeが確実に実行されるようにするために、bundle execを使用してrakeを実行します

remotelocal commented 9 years ago

rakeに-T dbオプションを付けて実行すると他にもさまざまなデータベースタスクが用意されているのがわかります。

$ bundle exec rake -T db

rakeで実行可能なタスクをすべて表示するには以下を実行します。

$ bundle exec rake -T

remotelocal commented 9 years ago

2章中断します。(10分ほど読みました。)リスト2.3 Usersコントローラの骨格。まで。

remotelocal commented 9 years ago

@記号で始まる変数はRubyではインスタンス変数と呼ばれます

remotelocal commented 9 years ago

2章読破。20分。

remotelocal commented 9 years ago

RSpecの学習方法として。 Code SchoolのRSpecコースの履修を検討してみるのもよいでしょう

remotelocal commented 9 years ago

Railsでセッション変数の暗号化に使用するための、いわゆる秘密トークン (secret token) を必ず更新することが重要です

config/initializers/secret_token.rb

# Be sure to restart your server when you modify this file.

# Your secret key is used for verifying the integrity of signed cookies.
# If you change this key, all old signed cookies will become invalid!

# Make sure the secret is at least 30 characters and all random,
# no regular words or you'll be exposed to dictionary attacks.
# You can use `rake secret` to generate a secure secret key.

# Make sure your secret_key_base is kept private
# if you're sharing your code publicly.
require 'securerandom'

def secure_token
  token_file = Rails.root.join('.secret')
  if File.exist?(token_file)
    # Use the existing token.
    File.read(token_file).chomp
  else
    # Generate a new token and store it in token_file.
    token = SecureRandom.hex(64)
    File.write(token_file, token)
    token
  end
end

SampleApp::Application.config.secret_key_base = secure_token
remotelocal commented 9 years ago
heroku logs
remotelocal commented 9 years ago

Railsのgenerateスクリプトでは、 underscoreメソッドを使ってキャメルケースをスネークケースに変換しています

remotelocal commented 9 years ago

結合テスト (RSpec では リクエストspec と呼んでいます) は、ユーザーがアプリケーションを使う際の一連のアクションをシミュレーションします。結合テストは、アプリケーションの各ページが正常に動作するかどうかをテストしてくれる強力なツールです。手動でブラウザを操作してテストする必要がなくなり、Capybaraを併用すれば自然言語 (英語) に近い文法でテストを記述する事もできます (Capybara以外にも、Cucumberという振舞駆動開発用ツールが有名です。詳細については8.3で紹介します)。

remotelocal commented 9 years ago

与えられた課題の解決法に今ひとつ確信が持てないときは、(テストを書かずに) まず試しにアプリケーションコードだけを書いてみて、どんな解決方法があるのか模索してみる方が良い結果を得られることもあります (エクストリーム・プログラミング (Extreme Programming) という開発手法では、この模索段階をスパイク (spike) と呼んでいます)。そして解決策が明確になった段階で、テスト駆動開発でコードを清書するという方法もありえます。

remotelocal commented 9 years ago

結合テストのジェネレータ

$ rails generate integration_test static_pages
      invoke  rspec
      create    spec/requests/static_pages_spec.rb
remotelocal commented 9 years ago

RSpec はダブルクォート (") で囲まれた文字列を無視しますので、

remotelocal commented 9 years ago

csrf_meta_tagsは、Web攻撃手法のひとつであるクロスサイトリクエストフォージェリー (cross-site request forgery: CSRF)を防ぐために使われるRailsのメソッドです。

remotelocal commented 9 years ago

3章の終盤でGuard、Sporkの言及があり、テストの機械があればこれを積極的に導入したい。 Guardは自動でRSPECを走らせるものでSporkはテストの高速化です。

remotelocal commented 9 years ago

3章読み終わり。多分40分くらいかな。

remotelocal commented 9 years ago

Railsチュートリアル を終えた後には「 Beginning Ruby」、「The Well-Grounded Rubyist」、「The Ruby Way」などの純粋なRubyについての本を読むことをお勧めします。

remotelocal commented 9 years ago

Railsコンソールでは、スタックから抜けるにはCtrl-C を押し、完全にコンソールを終了するにはCtrl-Dを押します。

remotelocal commented 9 years ago

Railsコンソールでは、スタックから抜けるにはCtrl-C を押し、完全にコンソールを終了するにはCtrl-Dを押します。

remotelocal commented 9 years ago

まじか。Setting.ymlが更新されない理由がここにあったな。

試してみたけど、やっぱりSettings.ymlの値は更新されなかったです。

remotelocal commented 9 years ago
attr_accessor :name, :email

ユーザー名とメールアドレスに対応するアトリビュートアクセサをそれぞれ作成します。このコードは、2.2.2でも説明したように、@nameおよび@emailインスタンス変数について、取り出し(get) と割り当て(set) を行う "ゲッター" と "セッター" というメソッドをそれぞれ作成します。

remotelocal commented 9 years ago

課題:Ruby API のオンラインマニュアルを見つけて、Hashクラスのmergeメソッドについて読んでみてください。

remotelocal commented 9 years ago

4章Done。40分くらいかな?

remotelocal commented 9 years ago

モックアップ (Webの文脈ではよく ワイヤーフレームと呼ばれます)

remotelocal commented 9 years ago

IE9以下に対応

!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
remotelocal commented 9 years ago

scssは同一要素をネストで表現できる。

#logo {
  ...
}

#logo:hover {
  ....
}
#logo {
  .....
  &:hover {
    ......
  }
}
remotelocal commented 9 years ago

同じ色を繰り返し表現できるように、変数っぽくできます。

$lightGray: #999;
.
.
.
h2 {
  .
  .
  .
  color: $lightGray;
}
.
.
.
footer {
  .
  .
  .
  color: $lightGray;
}

実際、Bootstrapフレームワークでは、多くの色に対して変数名を定義しています。定義されている変数はBootstrapページの「LESS変数一覧」で参照することができます

remotelocal commented 9 years ago

LESSではアットマーク@を使用しているのに対して、Sassはドルマーク$を使っていることはすぐにわかります。話を戻して、Bootstrapの変数の一覧表を見ると、薄い灰色に対して以下の変数名が与えられることに気が付きます。

@grayLight: #999; これは、bootstrap-sassというgemを使えば、SCSSでも同様に$grayLightという変数が使えることを意味しています。先ほど定義した$lightGrayというカスタム変数に代わりに、用意された変数を使ってみましょう。

remotelocal commented 9 years ago

詳細なルーティングの扱いについてはRailsガイドの「Rails ルーティング」を参照することをお勧めします。 http://railsguides.jp/routing.html

remotelocal commented 9 years ago

path書式を使用する一般的な規約に従い、リダイレクトの場合のみurl書式を使用します。これは、HTTP標準では技術的にリダイレクト後にフルURLが要求されるためです

remotelocal commented 9 years ago

shared exampleを使うとテストが簡潔に書ける。こんな感じ。

 shared_examples_for "all static pages" do
    it { should have_content(heading) }
    it { should have_title(full_title(page_title)) }
  end

  describe "Home page" do
    before { visit root_path }
    let(:heading)    { 'Sample App' }
    let(:page_title) { '' }

    it_should_behave_like "all static pages"
    it { should_not have_title('| Home') }
  end
remotelocal commented 9 years ago

5章読破。いろいろ集中できなくてとぎれとぎれで1時間20分くらいはかかってしまったきがする。

remotelocal commented 9 years ago

ほとんどのマイグレーションが可逆です。これは、db:rollbackというRakeタスクで変更を取り消せることを意味します。これを“マイグレーションの取り消し (migrate down)”と呼びます。

remotelocal commented 9 years ago

Railsコンソールを使用してデータモデルを調べてみましょう。現時点ではデータベースを変更したくないので、コンソールをサンドボックスモードで起動します。

$ rails console --sandbox
Loading development environment in sandbox
Any modifications you make will be rolled back on exit
>>
remotelocal commented 9 years ago

環境を整えるためにテスト環境用データベースを作成するコマンドを実行するのはこれが初めてです。

$ bundle exec rake test:prepare
remotelocal commented 9 years ago

モデルの属性をテストすることは良い習慣です。なぜなら、モデルの属性についてテストをすることで、そのモデルが応答すべきメソッドの一覧が一目で分かるからです。

remotelocal commented 9 years ago

テストで使われているrespond_toメソッドは、Rubyのrespond_to?メソッドを暗黙的に使っています。respond_to?メソッドは、シンボルを1つ引数として受け取り、そのシンボルが表すメソッドまたは属性に対して、オブジェクトが応答する場合はtrueを返し、応答しない場合はfalseを返します。

remotelocal commented 9 years ago

コメントアウトし、失敗するテストを書き、そして検証のコメントアウトを解除することで、そのテストをパスさせられるかどうかを確認します。この手続きは、このような単純なテストでは、大げさで気取ったものに感じられるかもしれません。しかし著者はこれまでに、実際には見当違いなことをテストしている「単純な」テストを山ほど見てきました。テスト駆動開発を慎重に進めることは、結局は「私たちが正しい事項をテストしている」という自信を得る為の唯一の方法なのです。(上で紹介したコメントアウトのテクニックは、コードはあってもテストがどこにもないようなひどいアプリケーションを急いで救出するときにも役に立ちます)。

remotelocal commented 9 years ago

素晴らしい正規表現エディタであるRubular (図6.4) が必要不可欠です11。RubularのWebサイトは、正規表現を作るための美しく対話的なインターフェイスを持っています。また、手軽な正規表現のクイックリファレンスにもなります。Rubularのサイトをブラウザで開き、表6.1の表現をひとつずつ入力して結果を確かめながら正規表現を学ぶことをぜひともお勧めします。正規表現について学んだことがなくても、Rubularを使えば2〜3時間ほどで慣れることができます (注: リスト6.14の正規表現をRubularで使う場合、冒頭の\Aと末尾の\zの文字は含めないでください)。