TIL/20211017/RubyOnRailsデータの転送


サーバへのデータ転送


paramsとして抽出できるデータ
1.POSTで送信されたデータ
2.クエリー・パラメータ
3.ルーティングパラメータ

formでデータを渡すプロセス


1.ビューからコントローラへのデータ転送
2.コントローラからクライアントから送信されたデータを抽出する
3.関連ビューからコントローラ応答のデータを出力する
Railsの構文の使用
1.form:htmlからサーバに値を渡す
2.params:コントローラからクライアントからのリクエスト情報を抽出する
3.@q変数:インスタンス変数、actionで使用、押し出しビューで使用
4.<%=%>:erbファイル用、<%=%>でRubyコードを提供

CRUD機能の実装


1.CRUDモデルの作成
rails gモデル[型番名]
ex) rails g model Post
2.移行ファイルにテーブル情報を作成する
生成された移行ファイルからテーブル情報を作成
  • titleコラムとコンテンツコラム
  • を作成
    class CreatePosts < ActiveRecord::Migration[5.2]
      def change
        create_table :posts do |t|
    		t.string :title
    		t.text :content
    
          t.timestamps
        end
      end
    end
    3.移行ファイルを使用したテーブルの作成
    rake db:migrate
    次の図のように作成を完了します.

    テーブル情報はdb/schemaです.rbに含める

    作成、Read


    合計3ページ

  • 1.index:すべての記事のページを表示する
    2.new:執筆フォーム付きページ
    3.show:記事の詳細ページを表示する
  • 行動計4つ:1.index,new,create(書く動作)、show
  • 内容を整理する
    @posts = Post.allコードはすべてのPostモデルのデータを文章とする
    (モデルクラス内のすべてのメソッドはSELECT*FROM「テーブル名」を実行し、テーブル内のすべての値をモデルオブジェクトの配列に戻します)
    p16
    RailsがHTTPメソッド(POST,PUT,DELETEなど)によりリクエストを送信すると自動的に乱数トークンを生成して送信する
    データの格納を要求する場合、HTTPメソッドはgetメソッドよりもpostメソッドを使用するのに適しています.

    更新、破棄


    作成するページ:フォームを含むeditページ
    作成するアクション
    1.edit
    2.update(文章の修正)
    3.destroy(記事削除)
    destroyはSQLにおけるDELETE FROM[テーブル名]WHERE条件である.クエリーの実行と同じ

    完全なコード


    routes.rb
    Rails.application.routes.draw do
      get 'posts/index'
      get 'posts/new'
      post 'posts/create'
      get 'posts/show/:id' => "posts#show"
      get 'posts/edit/:id' => "posts#edit"
      post 'posts/update/:id' => "posts#update"
      get 'posts/destroy/:id' => "posts#destroy"
      # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
    end
    posts_controller.rb
    class PostsController < ApplicationController
      def index
    	  @posts = Post.all
      end
    
      def new
      end
    
      def create
    	  Post.create(title: params[:title], content: params[:content])
    	  redirect_to "/posts/index"
      end
    
      def show
    	  @post = Post.find(params[:id])#:id 값을 추출한 뒤 모델의 find 메서드로 넘어온 id 값을 Post 모델에서 검색하고, 그 결과를 @post에 저장
      end
      def edit
    	  @post = Post.find(params[:id])#:id 값을 추출한 뒤 모델의 find 메서드로 넘어온 id 값을 Post 모델에서 검색하고, 그 결과를 @post에 저장
      end
      def update
    	  @post = Post.find(params[:id])
    	  @post.update(title: params[:title], content: params[:content])
    	  redirect_to "/posts/show/#{@post.id}" ##{}안에 변수명을 입력하면 문자열 안에 값이 포함된다
      end
      def destroy
    	  @post = Post.find(params[:id])
    	  @post.destroy
    	  redirect_to "/posts/index"
      end
    end
    index.html.erb
    <a href="/posts/new">새 글 작성</a>
    <hr/>
    <table border="1">
    	<tr>
    		<th>id</th>
    		<th>제목</th>
    		<th>내용</th>
    		<th>생성일</th>
    		<th>수정일</th>
    	</tr>
    	<% @posts.each do |post| %> #@posts 객체 배열 내용 순서대로 출력
    		<tr>
    			<td><%= post.id %></td>
    			<td><%= post.title %></td>
    			<td><%= post.content %></td>
    			<td><%= post.created_at %></td>
    			<td><%= post.updated_at %></td>
    		</tr>
    	<% end %>
    </table>
    new.html.erb
    <h4>
    	새 글 작성
    </h4>
    <form action="/posts/create" method="POST">
    	<input name="authenticity_token" value="<%= form_authenticity_token %>" type="hidden">
    	<input type="text" name="title">
    	<br/>
    	<textarea name="content"></textarea>
    	<button>
    		제출
    	</button>
    </form>
    show.html.erb
    <p>
    	title : <%= @post.title %>
    </p>
    
    <p>
    	content : <%= @post.content %>
    </p>
    
    <a href="/posts/index">Back</a>
    edit.html.erb
    <h4>
    	기존 글 수정
    </h4>
    <form action="/posts/update/<%= @post.id %>" method="POST">
    	<input name="authenticity_token" value="<%= form_authenticity_token %>" type="hidden">
    	<input type="text" name="title" value="<%= @post.title %>">
    	<br/>
    	<textarea name="content"><%= @post.content %></textarea>
    	<button>
    		수정
    	</button>
    </form>