Sinatraでエラーメッセージが表示されない問題

今Sinatraを使って掲示板を作っているんですけど、エラーメッセージ実装で戸惑ったのであげておきます。


前提

投稿フォームの入力欄はタイトルと本文。

どちらも空白は駄目です。

バリデーションで引っかかった際は投稿フォームに戻りエラーメッセージが表示されます。

エラー.png

こちらが実際に出来たページです。


苦戦したところ

最初は「バリデーションに引っかかったらエラーメッセージを配列に入れて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は参考になるサイトも少ないので僕自身とても苦戦しています。

同じような環境の人の解決のきっかけになれれば幸いです。