今Sinatraを使って掲示板を作っているんですけど、エラーメッセージ実装で戸惑ったのであげておきます。
#前提
投稿フォームの入力欄はタイトルと本文。
どちらも空白は駄目です。
バリデーションで引っかかった際は投稿フォームに戻りエラーメッセージが表示されます。
こちらが実際に出来たページです。
#苦戦したところ
最初は「バリデーションに引っかかったらエラーメッセージを配列に入れてViewに渡せばいいだけだから簡単じゃん」と思っていました。
しかし、何故かViewで表示されない。
そこでデバッガで見てみるとどこかのタイミングで配列がnilになっていました。
それは表示されねえや!(笑)と思いながら原因を探りました。
#解決策
初めの僕のコードは以下のようになっていました。
post '/posts/create' do
@post = Post.new(title: params[:title], body: params[:body])
if @post.save
redirect '/posts/page/1'
else
@errors = @post.errors.full_messages.uniq!
redirect '/posts/new'
end
end
redirectが問題でした。
redirectされるとアクションが呼び直されてしまうので@errorsがnilになってしまうのです。
ですので、redirectせずそのままViewファイルを渡してあげます。
post '/posts/create' do
@post = Post.new(title: params[:title], body: params[:body])
if @post.save
redirect '/posts/page/1'
else
@errors = @post.errors.full_messages.uniq!
erb :new_post
end
end
これで無事エラーメッセージが表示されるようになりました。
#まとめ
今回はsinatraでエラーメッセージを表示させる方法についてまとめました。
sinatraは参考になるサイトも少ないので僕自身とても苦戦しています。
同じような環境の人の解決のきっかけになれれば幸いです。