「Rails をはじめよう」をはじめる (2)
アプリケーションの実装と実行
config/routes.rbで articleリソース を宣言する
Rails.application.routes.draw do resources :articles root 'welcome#index' end
Railsは「articles」というリソース名から単数形の「article」を推測し、両者をその意味にそって使い分けているという点です。prefix列で単一の項目には単数形のarticle、複数項目を扱う場合には複数形のarticlesが使われているという具合です。
・・・articleとついているものを呼び出してくれているようです
➜ blog bin/rails routes Ignoring byebug-9.0.6 because its extensions are not built. Try: gem pristine byebug --version 9.0.6 Ignoring debug_inspector-0.0.2 because its extensions are not built. Try: gem pristine debug_inspector --version 0.0.2 Prefix Verb URI Pattern Controller#Action articles GET /articles(.:format) articles#index POST /articles(.:format) articles#create new_article GET /articles/new(.:format) articles#new edit_article GET /articles/:id/edit(.:format) articles#edit article GET /articles/:id(.:format) articles#show PATCH /articles/:id(.:format) articles#update PUT /articles/:id(.:format) articles#update DELETE /articles/:id(.:format) articles#destroy root GET / welcome#index
土台を設置
新規記事を作成するための場所がアプリケーション内に必要
ルーティングは既に定義されているので、リクエストはアプリケーションの/articles/newに送られます。ブラウザでhttp://localhost:3000/articles/newを開くと、今はルーティングエラーが表示されます。
このエラーが発生したのは、ルーティングで指定された先に、リクエストを処理するように定義されたコントローラが見つからない ではコントローラーを作成してみる
ArticlesControllerを作成
rails g controller articles
今度は、ArticlesControllerコントローラにnewアクションが見つからないというエラーが発生する コントローラ内でメソッドを定義する ArticlesControllerクラスの内側に以下のようにnewメソッドを作成
class ArticlesController < ApplicationController def new end end
articles/newというテンプレートをArticlesControllerは探しにいく
ブログアプリケーションのようなシンプルなRailsアプリケーションでは、テンプレートの置き場所は1箇所ですが、複雑なアプリケーションではさまざまな場所にテンプレートが置かれることもあります。
テンプレートをapp/views/articles/new.html.erbに置くのが最もシンプル
app/views/articles/new.html.erb →拡張子の意味 1つ目の拡張子はテンプレートの フォーマット 2つ目の拡張子は使用されるハンドラー
app/views/articles/new.html.erbを作成して、その中に以下のように記入
<h1>New Article</h1>
最初のフォーム
フォームを始めるためには、form builder を使用する Railsにはform_forというヘルパーメソッドがあり、主にこれを使用してフォームを作成する
app/views/articles/new.html.erbを書き換える
#このフォームを識別するためのオブジェクトを渡す こでは:articleというシンボル <%= form_for :article do |f| %> # このメソッドのブロックの内側はFormBuilderオブジェクトを置きます(fで表すのが通例です) #タイトル <p> <%= f.label :title %><br> <%= f.text_field :title %> </p> #記事本文 <p> <%= f.label :text %><br> <%= f.text_area :text %> </p> #fオブジェクトに対してsubmitを実行すると、フォームの送信ボタンが作成されます。 <p> <%= f.submit %> </p> <% end %>
小さいブログを新規作成するフォームができた
記入したブログの送信先を設定する app/views/articles/new.html.erbをエディタで開き、form_forの行を以下のように変更
<%= form_for :article, url: articles_path do |f| %>
bin/rails routesの結果
➜ blog bin/rails routes Ignoring byebug-9.0.6 because its extensions are not built. Try: gem pristine byebug --version 9.0.6 Ignoring debug_inspector-0.0.2 because its extensions are not built. Try: gem pristine debug_inspector --version 0.0.2 Prefix Verb URI Pattern Controller#Action articles GET /articles(.:format) articles#index POST /articles(.:format) articles#create new_article GET /articles/new(.:format) articles#new edit_article GET /articles/:id/edit(.:format) articles#edit article GET /articles/:id(.:format) articles#show PATCH /articles/:id(.:format) articles#update PUT /articles/:id(.:format) articles#update DELETE /articles/:id(.:format) articles#destroy root GET / welcome#index
articles_pathヘルパーは、articlesという接頭語に関連付けられているURIパターンをフォームの送信先とするようRailsに指示
5.3 記事を作成する
ArticlesControllerコントローラ内にcreateアクションを作成し、フォームが動作するようにする app/controllers/articles_controller.rbファイル内のArticlesControllerクラス内のnewアクションの下にcreateアクションを追加
class ArticlesController < ApplicationController def new end def create end end
実際のパラメータがどのようになっているかを確認するために、createアクションに以下の変更を加える
def create render plain: params[:article].inspect end
http://localhost:3000/articlesにはハッシュが表示された
<ActionController::Parameters {"title"=>"tetet", "text"=>"tetet"} permitted: false>