やりたい事
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
ここでしたこと
- データベースにproductテーブルを作成
- productテーブルにnameとtextカラムを作成
- それをデータベースに反映させる
コントローラーでどんな値をデータベースに持って行くか決める
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
ここでやっていること
- 値を入れてデータベースに持っていく箱を準備。
- データベースに保存するカラムを指定。それを関数にしている。
- 2の情報にしたがってデータを作成。
- 入力された値をデータベースに保存。
- 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万円で購入したジャケットです。ライトグレーで傷はありません。あわせやすいのでおすすめです。"
ここでしたこと
- = form_forで入力する部分を囲む。入った値は@productに飛ばします。その@productって言うのはコントローラーで用意したもの!
- = 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で飛ばしているところと、コントローラーで用意したものが一致しているかチェック!