フォームに値を入力したがValidatesに引っかかり、もう一度入力し直し。。。その時にページがリロードされ、さっき入力した値がまっさらに消えて、直さなくて良いところも入力し直し。。。それはあまりにも酷だ!!!
ということで、入力失敗した時に値を保持したままリロードする方法について記します。
だいたいformを使用して値を保存するアクションはcreateかupdateだと思うので、create、updateを例に紹介します。
createアクションの場合
まずnewアクション内で@hoge = hoge.newという空のインスタンス変数を作り、
そして、createアクションで@hoge = hoge.new(params[:hoge])と書く。この際に、フォームで入力した値はparams[:hoge]に値を格納されています。
なので、エラーしrenderで再びnewアクションに戻したいといった際、rende `new` の前にparamsの値を代入してあげれば良いのです。
実際に書いてみるとこんな感じでしょうか。
def new
  	@hoge = Hoge.new
end
def create
  @hoge = Hoge.new(user_params)
  if @hoge.save
    redirect_to 'static_pages/top'
    flash[:success] = "Welcome to the Hoge App!"
  else
    @hoge = Hoge.new(user_params) #newで入力した値を代入
    render 'new'
  end
end
updateアクションの場合
updateする際、update_attributes(params[:hoge])というメソッドを使用するかと思います。
この````update_attributes```は
@hoge.attributes = params[:hoge]
と
@hoge.save
を一気に行ってくれる便利なメソッドです。
今回でいうと、@hoge = hoge.attribute(params[:hoge])の中に入力された値が格納されているので、これをrennderの前に代入しましょう。
def update
  @hoge = Hoge.find(params[:id])
  @hoge.update_attributes(params[:hoge])
  if @hoget.save
    flash[:notice] = "更新しました!"
    redirect_to 'index'
  else
    @hoge.attributes = params[:hoeg]
    flash[:notice] = "失敗しました!"
    redirect_to edit_hoge_path
  end
end
