forked from ericallam/docrails
-
-
Notifications
You must be signed in to change notification settings - Fork 276
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
30 additions
and
32 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -579,7 +579,7 @@ Railsで「Hello」を表示するには、、少なくとも「**ルーティ | |
ルーティング | ||
------ | ||
|
||
Railsのルーティング(route、routing)はURLを構成する要素の1つであり、受信したHTTPリクエストを適切なコントローラーとアクションに転送することでリクエストの処理方法を決定します。 | ||
Railsのルーティング(route、routing)はURLを構成する要素の1つであり、受信したHTTPリクエストを適切なコントローラとアクションに転送することでリクエストの処理方法を決定します。 | ||
|
||
まず、URLとHTTPリクエストメソッドについて簡単に復習しましょう。 | ||
|
||
|
@@ -752,7 +752,7 @@ TIP: 訳注: 開発中のRailsサーバーでは、`http://localhost:3000/rails/ | |
コントローラとアクション | ||
--------------------- | ||
|
||
製品のルーティングを定義したので、次はコントローラーとアクションを実装して、これらのURLへのリクエストを処理できるようにしましょう。 | ||
製品のルーティングを定義したので、次はコントローラとアクションを実装して、これらのURLへのリクエストを処理できるようにしましょう。 | ||
|
||
以下の`bin/rails generate`コマンドは、`index`アクションを含む`ProductsController`を生成します。ルーティングは既に設定したので、`--skip-routes`フラグでジェネレータでのルーティング生成部分をスキップできます。 | ||
|
||
|
@@ -956,7 +956,7 @@ URLヘルパーは、ブラウザの外部で表示されるメールをレン | |
|
||
URLヘルパーを`link_to`ヘルパーによる`<a>`タグ生成と組み合わせると、タグを直接書かずにRubyだけできれいにリンクを生成できるようになります。`link_to`には、リンクの表示名(ここでは`product.name`)と、`href`属性で使うリンク先のパスまたはURL(ここでは`product`)を渡せます。 | ||
|
||
これらのヘルパーを使う形でリファクタリングすると、以下のようになります。 | ||
これらのヘルパーを使って`app/views/products/index.html.erb`をリファクタリングすると、以下のように簡潔なビューコードになります。 | ||
|
||
```erb#6 | ||
<h1>Products</h1> | ||
|
@@ -1015,7 +1015,7 @@ end | |
</div> | ||
``` | ||
|
||
`new`アクションに対応する`app/views/products/new.html.erb`ビューテンプレートを作成して、新しい`Product`のフォームをレンダリングできるようにします。 | ||
`new`アクションに対応する`app/views/products/new.html.erb`ビューテンプレートを以下の内容で作成して、新しい`Product`のフォームをレンダリングできるようにします。 | ||
|
||
```erb | ||
<h1>New product</h1> | ||
|
@@ -1055,7 +1055,7 @@ Railsのフォームビルダーによって、セキュリティ用のCSRFト | |
|
||
フォームビルダーに新しい`Product`インスタンスを渡したので、新規レコード作成用のデフォルトルーティングである`/products`パスに`POST`リクエストを送信するように構成されたフォームが、自動的に生成されました。 | ||
|
||
ここから送信されるフォームを処理するには、まずコントローラーに`create`アクションを以下のように実装する必要があります。 | ||
ここから送信されるフォームを処理するには、まずコントローラに`create`アクションを以下のように実装する必要があります。 | ||
|
||
```ruby#14-26 | ||
class ProductsController < ApplicationController | ||
|
@@ -1089,7 +1089,7 @@ end | |
|
||
#### Strong Parameters | ||
|
||
`create`アクションはフォームから送信されたデータを処理しますが、セキュリティのためにパラメータをフィルタリングしておかなければなりません。ここで役に立つのが、privateメソッドとして追加した`product_params`メソッドです(訳注: メソッド名の`product`の部分はモデル名と同じにするのが慣例です)。 | ||
`create`アクションはフォームから送信されたデータを処理しますが、セキュリティのためにパラメータをフィルタリングしておかなければなりません。ここで役に立つのが、privateメソッドとして追加した`product_params`メソッドです(訳注: メソッド名の`product`の部分はモデル名と同じ単数形にするのが慣例です)。 | ||
|
||
`product_params`メソッドは、リクエストで受け取ったパラメータを検査して、パラメータの配列を値として持つ`:product`というキーが必ず存在することを保証します。ここでは、製品に許可されているパラメータは`:name`のみなので、これ以外のどんなパラメータをRailsに渡しても無視されます(エラーにはなりません)。これにより、アプリケーションをハッキングしようとする悪意のあるユーザーからアプリケーションが保護されます。 | ||
|
||
|
@@ -1109,7 +1109,7 @@ redirect_to @product | |
|
||
`save`が失敗して、レコードが有効にならなかった場合、同じフォームを再レンダリングして、ユーザーが無効なデータを修正できるようにします。`create`アクションの`else`では`render :new`をレンダリングするように指示しています。 | ||
|
||
Railsは`Products`コントローラーにいることを認識しているので、`app/views/products/new.html.erb`ビューテンプレートをレンダリングする必要があります。 | ||
Railsは`Products`コントローラにいることを認識しているので、`app/views/products/new.html.erb`ビューテンプレートをレンダリングする必要があります。 | ||
|
||
`create`アクションでは`@product`変数が設定済みなので、`@product`をデータベースに保存できなかった場合でも、このビューテンプレートを再度レンダリングするとフォームに`Product`データが自動的に入力されます。 | ||
|
||
|
@@ -1354,9 +1354,9 @@ end | |
|
||
今のままでは誰でも製品を編集・削除できてしまうので、安全ではありません。製品管理でユーザー認証を必須にすることで、セキュリティを強化しましょう。 | ||
|
||
ここでは、Railsに付属している認証機能ジェネレータが利用できます。この認証機能ジェネレータを使って、`User`モデルと`Session`モデル、アプリケーションにログインするために必要なコントローラーとビューを作成できます。 | ||
ここでは、Railsに付属している認証機能ジェネレータが利用できます。この認証機能ジェネレータを使って、`User`モデルと`Session`モデル、アプリケーションにログインするために必要なコントローラとビューを作成できます。 | ||
|
||
再びターミナルを開いて、以下のコマンドを実行します。 | ||
再びターミナルを開いて、以下の認証機能ジェネレータコマンドを実行します。 | ||
|
||
```bash | ||
$ bin/rails generate authentication | ||
|
@@ -1380,17 +1380,15 @@ Railsコンソールでユーザーを作成するには、`User.create!`メソ | |
store(dev)> User.create! email_address: "[email protected]", password: "s3cr3t", password_confirmation: "s3cr3t" | ||
``` | ||
|
||
ジェネレータが追加した`bcrypt` gemを`bundle install`コマンドで取得します(BCryptは認証用のパスワードを安全にハッシュ化するのに使われます)。 | ||
|
||
Railsサーバーを再起動します。 | ||
Railsコンソールを終了し、ジェネレータが追加した`bcrypt` gemを反映するために以下のコマンドを実行してRailsサーバーを再起動します(BCryptは認証用のパスワードを安全にハッシュ化するのに使われます)。 | ||
|
||
```bash | ||
$ bin/rails server | ||
``` | ||
|
||
ブラウザでRailsアプリを開くと、どのページにアクセスしてもユーザー名とパスワードの入力を求められるので、ユーザーレコードの作成時に入力したメールアドレスとパスワードを入力します。 | ||
ブラウザでRailsアプリを開くと、どのページにアクセスしてもユーザー名とパスワードの入力を求められるようになります。 | ||
|
||
`http://localhost:3000/products/new`にアクセスして試してみましょう。 | ||
`http://localhost:3000/products/new`をブラウザで開いて、`User`レコードの作成時に入力したメールアドレスとパスワードを入力してみましょう。 | ||
|
||
正しいユーザー名とパスワードを入力するとページにアクセスできるようになります。また、ブラウザは今後のリクエストに備えてこうしたcredential(認証情報)を保存するので、ページビューを移動するたびに入力する必要はありません。 | ||
|
||
|
@@ -1429,29 +1427,29 @@ Log outボタンをクリックすると、`session_path`に`DELETE`リクエス | |
```ruby#2 | ||
class ProductsController < ApplicationController | ||
allow_unauthenticated_access only: %i[ index show ] | ||
# ... | ||
# (省略) | ||
end | ||
``` | ||
|
||
ログアウトしてから再び製品のindexページとshowページにアクセスし、認証なしでアクセスできるかどうかを確認してみてください。 | ||
|
||
### 認証済みユーザーにだけリンクを表示する | ||
|
||
製品を作成してよいのはログイン済みのユーザーだけなので、`app/views/products/index.html.erb`ビューを変更して、ユーザーが認証済みの場合にのみNew productリンクを表示するようにしましょう。 | ||
製品を作成してよいのはログイン済みのユーザーだけにしておきたいので、`app/views/products/index.html.erb`ビューの`link_to`行を以下のように変更して、ユーザーが認証済みの場合にのみNew productリンクを表示するようにしましょう。 | ||
|
||
```erb | ||
<%= link_to "New product", new_product_path if authenticated? %> | ||
``` | ||
|
||
Log outボタンをクリックすると、indexページのNew productリンクが非表示になります。`http://localhost:3000/session/new`にログインすると、indexページにNew productリンクが表示されます。 | ||
Log outボタンをクリックすると、indexページのNew productリンクが非表示になります。`http://localhost:3000/session/new`をブラウザで開いてログインすると、indexページにNew productリンクが表示されます。 | ||
|
||
オプションとして、先ほどのレイアウトの`<nav>`セクションでこのルーティングへのリンクを以下のように追加して、認証されていない場合はLoginリンクを表示するようにしてもよいでしょう。 | ||
オプションとして、先ほどの`app/views/layouts/application.html.erb`レイアウトの`<nav>`セクションに以下のルーティングへのリンクも追加して、認証されていない場合はLoginリンクを表示するようにしてもよいでしょう。 | ||
|
||
```erb | ||
<%= link_to "Login", new_session_path unless authenticated? %> | ||
``` | ||
|
||
また、`app/views/products/show.html.erb`ビューのEditリンクとDestroyリンクを以下のように更新して、認証済みの場合にのみこれらのリンクを表示するようにしてもよいでしょう。 | ||
また、`app/views/products/show.html.erb`ビューのEditリンクとDestroyリンクを以下のように更新して、認証済みの場合にのみEditリンクとDestroyリンクを表示するようにしてもよいでしょう。 | ||
|
||
```erb#4,7 | ||
<h1><%= @product.name %></h1> | ||
|
@@ -1492,7 +1490,7 @@ Read fragment views/products/show:a5a585f985894cd27c8b3d49bb81de3a/products/1-20 | |
Write fragment views/products/show:a5a585f985894cd27c8b3d49bb81de3a/products/1-20240918154439539125 (4.0ms) | ||
``` | ||
|
||
このページを初めて開くと、Railsはキャッシュキーを生成して、キャッシュストアが存在するかどうかを問い合わせます。これがログの`Read fragment`行です。 | ||
キャッシュを有効にしてからこのページを初めて開くと、Railsはキャッシュキーを生成して、キャッシュストアが存在するかどうかを問い合わせます。これがログの`Read fragment`行です。 | ||
|
||
これは初めて表示したページビューなのでキャッシュは存在せず、HTMLが生成されてキャッシュに書き込まれます。これはログの`Write fragment`行として確認できます。 | ||
|
||
|
@@ -1618,13 +1616,13 @@ end | |
end | ||
``` | ||
|
||
最後に、製品画像を`app/views/products/show.html.erb`で表示できるようにしましょう。冒頭に次のコードを追加します。 | ||
最後に、`app/views/products/show.html.erb`の冒頭に以下のコードを追加して、製品画像を表示できるようにしましょう。 | ||
|
||
```erb | ||
<%= image_tag @product.featured_image if @product.featured_image.attached? %> | ||
``` | ||
|
||
製品画像をアップロードしてみると、保存後に表示ページに画像が表示されるようになります。 | ||
`http://localhost:3000/products/new`をブラウザで開いて、Featured imageの「ファイルを選択」ボタンをクリックして製品画像をアップロードしてみると、保存後にshowページに画像が表示されるようになります。 | ||
|
||
詳しくは、[Active Storage の概要](active_storage_overview.html)を参照してください。 | ||
|
||
|
@@ -1635,7 +1633,7 @@ Railsを使えば、アプリを他の言語に翻訳しやすくなります。 | |
|
||
ビューの`translate`ヘルパー(短縮形は`t`)は、名前で訳文を検索して、現在のロケール設定に合うテキストを返します。 | ||
|
||
`app/products/index.html.erb`の`<h1>`見出しタグを以下のように更新して、訳文が使われるようにしてみましょう。 | ||
`app/products/index.html.erb`の`<h1>`見出しタグを以下のように更新して、見出しに訳文が使われるようにしてみましょう。 | ||
|
||
```erb | ||
<h1><%= t "hello" %></h1> | ||
|
@@ -1650,11 +1648,11 @@ en: | |
hello: "Hello world" | ||
``` | ||
それでは、スペイン語用の新しいロケールファイルを作成してみましょう。エディタで`config/locales/es.yml`ファイルを作成し、以下の訳文を追加します。 | ||
それでは、日本語用の新しいロケールファイルを作成してみましょう。エディタで`config/locales/ja.yml`ファイルを作成し、以下の訳文を追加します。 | ||
|
||
```yaml | ||
es: | ||
hello: "Hola mundo" | ||
ja: | ||
hello: "こんにちは、世界" | ||
``` | ||
|
||
次に、どのロケールを利用するかをRailsに伝える必要があります。 | ||
|
@@ -1677,7 +1675,7 @@ end | |
このコードはすべてのリクエストで実行され、パラメータ内の`locale`を探索して、見つからない場合はデフォルトのロケール(通常は`en`)にフォールバックします。これに基づいてリクエストのロケールを設定し、完了後にリセットします。 | ||
|
||
* `http://localhost:3000/products?locale=en`をブラウザで開くと、英文が表示されます。 | ||
* `http://localhost:3000/products?locale=es`をブラウザで開くと、スペイン語の訳文が表示されます。 | ||
* `http://localhost:3000/products?locale=ja`をブラウザで開くと、日本語の訳文が表示されます。 | ||
* ロケールを指定しない`http://localhost:3000/products`をブラウザで開くと、英語にフォールバックします。 | ||
|
||
次は、indexページの`<h1>`見出しのサンプル訳文を、実際の訳文に差し替えてみましょう。`app/views/products/index.html.erb`の見出しを以下のように更新します | ||
|
@@ -1698,17 +1696,17 @@ en: | |
title: "Products" | ||
``` | ||
|
||
スペイン語のロケールファイルにも、以下のように英語ロケールファイルと対応する形で訳文を追加します。 | ||
日本語のロケールファイルにも、以下のように英語ロケールファイルと対応する形で訳文を追加します。 | ||
|
||
```yaml | ||
es: | ||
hello: "Hola mundo" | ||
ja: | ||
hello: "こんにちは、世界" | ||
products: | ||
index: | ||
title: "Productos" | ||
title: "製品" | ||
``` | ||
|
||
これで、`http://localhost:3000/?locale=en`で英語ロケールを表示すると「Products」が表示され、`http://localhost:3000/?locale=es`でスペイン語ロケールを表示すると「Productos」が表示されるようになります。 | ||
これで、`http://localhost:3000/?locale=en`で英語ロケールを表示すると「Products」が表示され、`http://localhost:3000/?locale=ja`で日本語ロケールを表示すると「製品」が表示されるようになります。 | ||
|
||
詳しくは[Rails 国際化(I18n)API](i18n.html)ガイドを参照してください。 | ||
|
||
|