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

6章done. なかなか集中できませんでした。

remotelocal commented 9 years ago

デバッグ表示を整形するための追加と、Sassのミックスイン。

mixinすると、定義した内容が再利用できる。

app/assets/stylesheets/custom.css.scss

@mixin box_sizing {
......
}
.
.youso {
  @include box_sizing;
}
remotelocal commented 9 years ago

pluralizeという英語専用のテキストヘルパーが新たに登場しています。このヘルパーはデフォルトではコンソールでは使用できませんが、ActionView::Helpers::TextHelperを経由して明示的にインクルードできます9。

include ActionView::Helpers::TextHelper pluralize(1, "error") => "1 error" pluralize(5, "error") => "5 errors" pluralizeの最初の引数に整数が与えられると、それに基づいて2番目の引数の英単語を複数形に変更したものを返します。このメソッドの背後には強力なインフレクター (活用形生成) があり、不規則活用を含むさまざまな単語を複数形にすることができます。

remotelocal commented 9 years ago

7章まで一応読み終えた。

remotelocal commented 9 years ago

http://railstutorial.jp/chapters/sign-in-sign-out?version=4.0#top

remotelocal commented 9 years ago

インスタンスがない場合でも、こういう感じでフォームが作れる

form_for(:session, url: sessions_path)

actionは/sessionsになりますね。これはsessions_pathが影響しているのだと思います。 変数はname="session[hoge]"のようになりますね。 これは第一引数のシンボルが影響しているのだと思います。

フォーム送信後にparamsハッシュに入る値が、メールアドレスとパスワードのフィールドにそれぞれ対応したparams[:session][:email]とparams[:session][:password]になることを推測できることでしょう

remotelocal commented 9 years ago

SessionsヘルパーモジュールをApplicationコントローラにインクルードする。

app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  include SessionsHelper
end

デフォルトでは、すべてのヘルパーはビューで使用できますが、コントローラでは使用可能になっていません。Sessionsヘルパーはビューとコントローラの両方でメソッドが必要となるので、コントローラでは上のように明示的にインクルードする必要があります。

remotelocal commented 9 years ago

itsメソッドは、itと似ていますが、itが指すテストのsubject (ここでは@user) そのものではなく、引数として与えられたその属性 (この場合は:remember_token) に対してテストを行うときに使用します。

its(:remember_token) { should_not be_blank }

つまり、上のコードは以下と等価です。

it { expect(@user.remember_token).not_to be_blank }
remotelocal commented 9 years ago

否定の演算子が必要なので、! ("bang" と読みます)

remotelocal commented 9 years ago

Cucumberを使用すると、アプリケーションの振る舞いをテキストベースの「ストーリー」で定義することができます。多くのRailsプログラマーは、Cucumberは顧客と共同作業するときに便利であることを知っています。Cucumberのストーリーは、専門知識のない人でも読むことができ、ストーリーを顧客と共有したり、場合によっては顧客がストーリーを作成することすらできるためです。もちろん、テスティングのフレームワークが純粋なRubyでないという点は残念でもあり、著者にとってはテキストベースのストーリーはいささか冗長な面もあると思われます。それでもCucumberはRubyのテスティングツールキットとして確固たる地位を占めており、著者としては低レベルの実装を気にすることなく高度な振る舞いを記述できる点が特に気に入っています。

remotelocal commented 9 years ago

おすすめは「The RSpec Book 」(David Chelimsky著)、「 Rails 3 in Action 」(Ryan Bigg、Yehuda Katz著)、 「The Cucumber Book」(Matt Wynne、Aslak Hellesøy著) です)。(訳注: 日本語で読めるCucumberの書籍としては「はじめる!Cucumber」(諸橋 恭介著) があります。)

remotelocal commented 9 years ago

8章おわり。

remotelocal commented 9 years ago

WebブラウザはネイティブではPATCHリクエスト (表7.1でRESTの慣習として要求されている) を送信できないので、RailsはPOSTリクエストと隠しinputフィールドを利用してPATCHリクエストを「偽造」しています3。

remotelocal commented 9 years ago

Railsはどうやって新規ユーザー用のPOSTリクエストとユーザー編集用のPATCHリクエストを区別するのでしょうか。その答えは、Railsは、ユーザーが新規なのか、それともデータベースに存在する既存のユーザーであるかを、Active Recordのnew_record?論理値メソッドを使用して区別できるからです。

$ rails console

User.new.new_record? => true User.first.new_record? => false Railsは、form_for(@user)を使用してフォームを構成すると、@user.new_record?がtrueのときにはPOSTを、falseのときにはPATCHを使用します。

remotelocal commented 9 years ago

factory_girlでは、パラメータにハッシュを渡すことで、そこだけ変えてユーザを作れますよってからに。

let(:user) { FactoryGirl.create(:user) }
let(:wrong_user) { FactoryGirl.create(:user, email: "wrong@example.com") }
remotelocal commented 9 years ago

フレンドリーフォワーディング

ここまででWebサイトの認可機能は完成したかのように見えますが、後1つ小さなキズがあります。保護されたページにアクセスしようとすると、問答無用で自分のプロファイルページに移動させられてしまいます。別の言い方をすれば、ログオンしていないユーザーが編集ページにアクセスしようとしていたなら、ユーザーがサインインした後にはその編集ページにリダイレクトされるようにするのが望ましい動作です。リダイレクト先は、ユーザーが開こうとしていたページにしてあげるのが親切というものです。

このような動作を “フレンドリーフォワーディング” と呼びます

remotelocal commented 9 years ago

GemfileにFaker gemを追加します (リスト9.28)。これは、実際にありそうなユーザー名とメールアドレスを持つサンプルユーザーを自動的に作成するものです。

remotelocal commented 9 years ago

lib/tasks/sample_data.rake

namespace :db do
  desc "Fill database with sample data"
  task populate: :environment do
    User.create!(name: "Example User",
                 email: "example@railstutorial.jp",
                 password: "foobar",
                 password_confirmation: "foobar")
    99.times do |n|
      name  = Faker::Name.name
      email = "example-#{n+1}@railstutorial.jp"
      password  = "password"
      User.create!(name: name,
                   email: email,
                   password: password,
                   password_confirmation: password)
    end
  end
end
remotelocal commented 9 years ago

Rails 4.0からは、あらゆるスコープは、スコープで必要な域値を返す無名関数を受け取ります。これにより、スコープをその場で評価する必要がほぼなくなり、後に読み込まれたときに必要に応じて評価するようになります (いわゆる遅延評価 (lazy evaluation) です)。上のコードの場合、以下がその関数です。

-> { order('created_at DESC') }

この種のオブジェクトの構文は、Proc (手続き: procedure) とかラムダ (lambda)と呼ばれ、->という矢印で表されます。この構文はブロック (4.3.2) を引数に取り、後にcallメソッドによって呼び出されるときにブロックを実際に評価します。この構文をコンソールで確かめてみましょう。

>> -> { puts "foo" }
=> #<Proc:0x007fab938d0108@(irb):1 (lambda)>
>> -> { puts "foo" }.call
foo
=> nil
remotelocal commented 9 years ago

RailsCasts。強く推奨します。このRailsCastsの素晴らしさについては、どれほど言葉を尽くしても足りません。最初にRailsCastsエピソードアーカイブを開いて、目についたトピックを適当に開くところから始めてみるとよいでしょう。 RubyとRailsのお勧め書籍。「Beginning Ruby」(Peter Cooper 著)、「The Well-Grounded Rubyist」(David A. Black著)、「Eloquent Ruby」(Russ Olsen著)、Rubyをさらに深く学ぶのであれば 「The Ruby Way」(Hal Fulton著) がお勧めです。Railsをさらに深く学ぶのであれば、「The Rails 3 Way」(Obie Fernandez著)と「Rails 3 in Action (第2版待ち)」(Ryan Bigg、Yehuda Katz著) がお勧めです。 PeepCodeとCode School。PeepCodeのスクリーンキャストとCode Schoolのインタラクティブコースは品質が高いことで知られており、強くお勧めいたします。