pictweet作成 part3

Pictweet 削除機能

Destroyアクションを使用

以下の様な流れで設定を行う

1、ツイートを削除するためのルーティングを設定する

2、削除ボタンをビューに追加する

3、Destroyアクションをコントローラーに定義する

4、削除後のビューを追加する

 

1、routes.rbにdestroyアクションを定義する

resources :tweets, only: [:index, :new, :create, :destroy]

 

2、link_toメソッドを使用して削除ボタンをindex.html.erbに追加

削除するツイートを区別するために削除ボタンのパスにはツイートidをパラメータとして持たせる

httpメソッドはDELETEというメソッドを指定

<div class="more">
        <span><%= image_tag 'arrow_top.png' %></span>
        <ul class="more_list">
          <li>
            <%= link_to '削除', "/tweets/#{tweet.id}", method: :delete %>
          </li>
        </ul>
      </div>

 

*Prefixを用いて遷移先を設定する

Prefix:パスの指定方法の一つ

# Prefix未使用
<%= link_to "link_button", '/', class: "header__title--text" %>

# Prefix使用
<%= link_to "link_button", root_path, class: "header__title--text" %>

rails routesでprefixという文字がありその配下に出てくるがこのprefix名に続けて_pathという記述を付け加える

 

 <%= link_to '削除', tweet_path(tweet.id), method: :delete %

今回はdestoryアクションに対するprefixがtweetということがわかる

なのでtweet_pathとする

またprefixを使用するときは”/tweets/#{tweet.id}と記述してそれぞれのツイートid(tweet/id)が入る様にする

 

3、destroyアクションをコントローラーに定義する

2までを行うとボタン削除ボタンが現れるがクリックしてもエラーが出る

これはdestoryアクションが定義さえれていないため

 

Tweetsコントローラーにdestroyアクションを以下のように定義する

 

def destroy

tweet = Tweet.find(params[:id])

tweet.destroy

end

 

処理の流れとしてはまずパラメーターを受け取ったparams[:id]をもとに削除したいツイートをfindメソッドを用いて取得

そのツイートをdestroyメソッドで削除

 

4、削除完了画面のビューを作成

Tweetsディレクトリ中にビューファイルdestroy.html.erbを作成し以下のように記述

 

<div class="contents row">
  <div class="success">
    <h3>削除が完了しました。</h3>
    <a class="btn" href="/">投稿一覧へ戻る</a>
  </div>
</div>

pictweet作成 part2

投稿機能実装

アクション名 new,createを使用

*ルーティングを定義したらコントローラに定義する!

 

1、newアクションを定義する(ルーティング)

Config/routes.rbファイルで新たに:newとルーティングを記述することでhttp://localhost3000/tweets/new

にアクセスした場合にtweetsコントローラのnewアクションが実行される設定ができる

 

2、newアクションをコントローラに定義する

tweets_controller.rbにnewアクションを定義する

def new
    @tweet = Tweet.new
  end

 

3、投稿画面のビューを作成

ツイート投稿画面(new.html.erb)でform_withというヘルパーメソッドを使用する

form_with:railsで情報を送信すためのヘルパーメソッド

データベースに保存するときは以下のようにする

form_with model: モデルクラスのインスタンス do |form|

 

今回は

<%= form_with(model: @tweet, local: true) do |form| %> とする

これで指定しているインスタンス変数はコントローラーで定義した@tweet = Tweet.newのこと

(これをすると投稿先のパスやhttpメソッドを指定する必要がなくなる)

 

4、テーブルにデータを保存する処理 (ルーティング)

createを使用

 

5、tweets_controller.rbを編集(コントローラー)

以下の様に編集する

def create
    Tweet.create(tweet_params)
  end

  private
  def tweet_params
    params.require(:tweet).permit(:name, :image, :text)
  end

 

①def create~でcreateアクションを定義する

tweet_paramsというストロングパラメータを定義する

・ストロングパラメータ:フォームから入力された情報を指定して安全に受け取るための仕組み

以下はストロングパラメータで使用できるメソッド

  -requireメソッド:取得したい情報を指定することができる

  -permitメソッド:取得したいキーを指定

  -privateメソッド:クラス外から呼び出せないメソッド

 

6、投稿完了画面のビューを作成

create.html.erbを編集

 

7、空のツイートが投稿できない様にバリでショーンを設定する

バリデーションはデータを登録する際に一定の制約をかけること

validates : カラム名、バリデーションの種類

今回はvalidates :name, presence:trueとすることでnameカラムがカラではないかというバリデーションを設ける

pictweet作成 part1

モデル→テーブル→ルーティング→コントローラー→ビューの順に作成する

1、Tweetモデルを作成

  rails g model tweet

2、テーブルを作成

  テーブルとはデータベース内に作成されるデータを収納する場所のこと

  rails g modelコマンドでモデルを作成した際にマイグレーションファイルが生成された

  このファイルはテーブルの設計図でどのようなテーブルにするかをマイグレーションファイル内に記載しその情報を反映させることでテーブル作成及び変更ができる

マイグレーションファイルの編集

class CreateTweets < ActiveRecord::Migration[6.0]
  def change
    create_table :tweets do |t|
      t.string :name
      t.string :text
      t.text :image
      t.timestamps
    end
  end
end

*create_table :tweets do |t|と書かれていることから実際にtweetsテーブルを作成するという意味になる

*t.カラムの型 :カラム名でカラムを追加することができる

 string→短文の際に使用する ex:ユーザー名、メールアドレスなど

text→長文の際に使用 ex:投稿文など

rails db:migrateマイグレーションを実行

③コンソール上でデータベースに値を入れるためrails cでコンソール起動

[1] pry(main)> Tweet.create(name: "takashi", text: "Nice to meet you!")
[2] pry(main)> Tweet.create(name: "ishi", text: "Hello world!")
[3] pry(main)> Tweet.create(name: "yabe", text: "railsへようこそ!")
[4] pry(main)> exit

 ④Sequel Proでtweetsデーブルとコンソールで追加した値があるかを確認する

3、ルーティングの設定

config/routes.rb

Rails.application.routes.draw do
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
  resources :tweets, only: :index
end

 *resourceメソッドは7つのアクションへのルーティングを自動で生成する

:tweetsで/tweetsのパスに対応するルーティングが生成される

onlyを加えると指定したアクション(今回の場合はindex:一覧表示)のみを設定できる

4、コントローラーを作成及び編集

rails d controller tweetsコマンドでコントローラーを作成

②以下のようにtweets_controller.rbを編集する

class TweetsController < ApplicationController
  def index
    @tweets = Tweet.all
  end
end

* allメソッドでtweetsテーブル全てのレコードをインスタンス変数に代入しビューに受け渡しができるようにする

5、ビューを作成

app/views/tweets/index.html.erb

<div class="contents row">
  <% @tweets.each do |tweet| %>
    <div class="content_post" style="background-image: url(<%= tweet.image %>);">
      <p><%= tweet.text %></p>
      <span class="name">
        <%= tweet.name %>
      </span>
    </div>
  <% end %>
</div>

*@tweetsはコントローラーに記載してあるインスタンス変数のこと

 実際にはこの後レイアウトテンプレートを編集し画像ファイルを配置をする

その後rails sコマンドでhttp://localhost:3000/tweetsにアクセスすることができる