新規登録機能の作成

一覧画面に新規登録のリンクを作成する

h1 タスク一覧

# btnとbtn-primaryの2つのCSSクラスを与えることで、bootstrapがリンクをボタンにような見た目にする
= link_to '新規登録', new_task_path, class: 'btn btn-primary'
  • new_task_pathは、リンク先のURL

翻訳情報を追加する

  • バラバラに記述しないでいいように一箇所にまとめる
          has_many: "%{record}が存在しているので削除できません"
    # ここから追加
    models:
      task: タスク
    attributes:
      task:
        id: ID
        name: 名称
        description: 詳しい説明
        created_at: 登録日時
        updated_at: 更新日時

新規登録のためのアクションを実装

  def new
    # この1行を追加
    @task = Task.new
  end
  • アクションからビューに渡したいデータをインスタンス変数にいれる

新規登録画面のビューを実装する

  • ジェネレータにより、作成されたファイルを編集していく
  • form_withはHTMLのform要素を作成するメソッド
  • ブロック引数fに対して、text_fieldなどのメソッドを呼び出すことでフィールドを出力
h1 タスクの新規登録

.nav.justify-content-end
  = link_to '一覧', tasks_path, class: 'nav-link'

= form_with model: task, local: true do |f|
  .form-group
    # 入力欄の名前を表示
    = f.label :name
    # 入力欄を出力
    = f.text_field :name, class: 'form-control', id: 'task_name'
  .form-group
    # 説明欄の名前を表示
    = f.label :description
    # 説明欄を出力
    = f.text_area :description, rows: 5, class: 'form-control', id: 'task_description'
    # submitヘルパーを呼び出して,submitボタンを表すHTMLが表示される
  = f.submit nil, class: 'btn btn-primary'

登録アクションの実装

  def create
    @task = Task.new(task_params)
    @task.save
    redirect_to @task, notice: "タスク 「#{@task.name}」を登録しました。"
  end
  • task_paramsには、フォームから送られてきた情報が想定通り{task: {...}}の形であることを確認して、{...}の中から、名称と詳しい説明の情報を抜き取る役割がある

レンダーとリダイレクト

  • レンダー・・・アクションに続きビューを表示させること(renderメソッド)
  • リダイレクト・・・アクション後にビューを表示せず、別のURLに案内すること(redirect)

Flashメッセージ

    .container
      # ここから追加
      - if flash.notice.present?
        .alert.alert-success = flash.notice
      # ここまで
      = yield
# :flashというキーの値にハッシュとして渡せば、どんなキー(:notice,:alertなど)のデータも渡すことができる
redirect_to tasks_url, flash: {warning: "何かの警告メッセージ"}

# 直後にレンダーするビューに対してデータを伝えることができる
flash.now[:alert] = "〇〇"
flash.now.alert = "〇〇"