ユーザーの方が行き詰まったので投稿機能を作成することにした。
そのためにMySQLでテーブルを作成する。
その後にモデルのファイルを作成、そこでバリデーションをかける。
その後実装する機能としては
・投稿機能
・投稿詳細ページ
・投稿一覧機能
・投稿編集
・投稿削除
postsテーブルを作成
投稿の文章のデータ型を何にしようか?
調べてみると
CHAR
,VARCHAR
,TEXT
とある。
どれを使えばいいのだろう?
CHAR(固定長文字列)
何があっても宣言された文字分の領域を使う。
列に入れる文字列の長さが細田長に満たないばああい、文字列が最大長になるまで空きを半角スペースで埋めます。
出典 SQLゼロから始めるデータベース操作第二版 p35
VARCHAR(可変長文字型)
カラムに宣言されたサイズを上限として値の文字数ぶんだけの領域を使用する。
最大長に満たさなくても、半角スペースで埋めなくてもいい。
出典 SQLゼロから始めるデータベース操作第二版 p35
大体長くなければvarchar(255)で足りる。
TEXT型
65,535バイトを超える長い文字列を扱う。
出典 MySQL徹底入門第4版 p97
そもそもデータの長さとは?
バイトとは基本的な単位である。
1文字=1バイト
このバイトを1024倍した単位がキロバイト
つまり
ギガバイトの場合は
1024x1024x1024の値だ。
その値分の文字を記憶できる。
出典 SQLゼロから始めるデータベース操作第二版 p188
モデルのファイルを作成
class Post < ApplicationRecord
validates :content, {presence: true, length: { maximum: 140 }}
end
投稿機能ページを作成
ルーティングを設定
get '/posts/:id', to: 'posts#new'
コントローラーを作成
def new
end
ビューを作成
new.html.erb
を作成。表示成功
投稿機能を作成
ルーティングを設定
post '/posts/create', to: 'posts#create'
コントローラーを作成
.
.
.
def create
@post = Post.new(content: params[:content])
if @post.save
flash[:notice] = "投稿に成功しました。"
redirect_to "/posts"
else
@error_message = "投稿に失敗しました。"
render "posts/new"
end
end
.
.
.
Routing Error
No route matches [GET] "/posts/create"
少し悩んだ。
redirect_to "/posts/create"
にしていたからだ。
GETで設定していないのに書いたからこうなった。
直したのが上のコード
ビューを作成
<%= form_tag('/posts/create', method: :post) do %>
<p>投稿内容</p>
<textarea name="content"></textarea>
<input type="submit" value=保存>
<% end %>