memorandum

IT技術の習得を記録します

「Rails をはじめよう」をはじめる (2)

Rails をはじめよう | Rails ガイド

アプリケーションの実装と実行

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>

f:id:IT_expertise_diary:20161210193412p:plain

最初のフォーム

フォームを始めるためには、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 %>

小さいブログを新規作成するフォームができた f:id:IT_expertise_diary:20161210194105p:plain

記入したブログの送信先を設定する 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>