やりたい事

railsのアプリでform_forを使ってデータベースに保存したい

手順

データベースにテーブルとカラムを用意

コントローラーで保存する箱を用意、データベースに保存するカラム(値)を用意

form_forを使いf.text_fieldなどで値がカラムに入った情報をコントローラー側で用意した箱に送る!

こんな感じでできる

はじめに

データベースに保存するテーブルとそのカラム(中身)を用意

rails g model モデル名(小文字) カラム名(小文字):型(小文字)

  今回はproductテーブルにnameカラムとtextカラムを用意した

rails g model product name:string text:string
  
  そのあとにデータベースに反映させるコマンド

rake db:migrate 

ここでしたこと

  1. データベースにproductテーブルを作成
  2. productテーブルにnameとtextカラムを作成
  3. それをデータベースに反映させる

コントローラーでどんな値をデータベースに持って行くか決める

class ProductsController < ApplicationController

  def new
    @product = Product.new 1 データベースに保存する箱を用意 
  end

  def create
    @product = Product.new(products_params) 3 選択されたカラムにしたがって値を作成 
    @product.save データベースを保存 4
  end

  private

  def products_params
    params.require(:product).permit(:name, :text) 2 productテーブルのnameとtextだけ保存したい! 保存するカラムの指定
  end
end

ここでやっていること

  1. 値を入れてデータベースに持っていく箱を準備。
  2. データベースに保存するカラムを指定。それを関数にしている。
  3. 2の情報にしたがってデータを作成。
  4. 入力された値をデータベースに保存。
  5. 3,4は @product = Product.create(products_params) の1行で済ませることも可能

Viewページにform_forの記述たちを追加

    =form_for(@product, url: products_path) do |f| 1 入力された値たちを@productに飛ばす
        %h2.header_logo
          商品の情報を入力
        .content_upload
          %h3.content_upload__logo 
            出品画像
            %span.header_icon__logo
              必須  
          %p.content_upload__logo--sub
            最大10枚までアップロードできます
          %h3.content_upload__logo--sub--item
            ドラッグアンドドロップ
            %br
            またはクリックしてファイルをアップロード
        .product_name
          %h4.product_name__item
            商品名
            %span.icon__logo
              必須  
          = f.text_field :name,class:"product_name__contents",placeholder: "商品名(必須 40文字まで)" 2 ここでnameカラムに入力された値を入れる
          %h4.product_name__item--sub
            商品の説明
            %span.icon__logo
              必須
          = f.text_area :text ,class: "product_name__contents--sub",placeholder: "商品の説明名(必須 1,000文字以内) (色、素材、重さ、定価、注意点など)例)2010年頃に1万円で購入したジャケットです。ライトグレーで傷はありません。あわせやすいのでおすすめです。"

ここでしたこと

  1. = form_forで入力する部分を囲む。入った値は@productに飛ばします。その@productって言うのはコントローラーで用意したもの!
  2. = f.text_fieldで入力された値を入れるカラムを指定。:name, :textって書かれているところ

ポイント

コントローラー側で保存する箱と入れる値(カラム)を用意

ビュー側でform_forの記述

  • form_forは入った値をどこに持っていくか記述(コントローラへ)
  • その下のf.text_fieldなどは入力された値をどのカラムに入れるか記述

コントローラーで保存するカラムの指定ができてない

f.text_fieldなどを使いview側では値を入れることが出来ても、コントローラー側でその値を入れるカラムを用意しないと値は保存されない。

もちろんデータベース側にカラムがない場合は先にそっちで作ろう。

def products_params
    params.require(:product).permit(:name, :text) 2 productテーブルのnameとtextだけ保存したい! 保存するカラムの指定
  end

これはproductテーブルのnameとtextにデータが入るようになる

リンクが飛ばせてない

form_forで値を取れているがその中身をどこに飛ばすかを記述しないと値が飛んで行かずにエラーになる。

=form_for(@product, url: products_path) do |f| 1 入力された値たちを@productに飛ばす

この@productはコントローラー側で用意(変数定義)したもの

この場合はform_forで飛ばしているところと、コントローラーで用意したものが一致しているかチェック!

以上!