railsでvalidationで弾かれて再度postした際にrouting errorになる

目次

マーケター、エンジニアを月1時間からジョインできるプラットフォーム

airteamは月1時間からマーケターやエンジニアに相談できるプラットフォーム。 雇うのはハードル高いけどプロをチームに入れたい。そんな経営者のためのサービスです。 相談にのる方も募集しています。

タスクなしだから月一時間からジョイン可能

作業はなくオンライン相談メイン。 月1時間からさっと経験者に継続的に相談できます。

多様な経験者を雇用するより何倍も早くチームに

あらゆるジャンルの経験者がいるので あなたのチームのノウハウの選択肢が広がります。

NDAはすでに締結済み、契約もスムーズ

契約の煩雑なやりとりはなく、NDAはすでに締結済み、書面のやりとりはありません。

railsでvalidationに弾かれた際に再度postしようとするとrouting errorになってしまうのでその対策。flashを使って対応したが、もっといいやり方がある気がする。

状況

railsのバグ?なのか

  • usersをpostをしようとする
  • validationで同じページに戻る
  • urlがroot/usersに
  • もう一回postするとrouting errorに

上記の状況になる。routing errorはroot/usersでpostをしたけどget root/users扱いになりrouting errorになる。

redirect_to new_career_path

redirect_toで遷移させるとちゃんとusers/newに遷移するが、そうすると前の値を残していないので再度入力しないといけない。

流れ

  • flashで値を保存
  • redirect_toで遷移
  • 遷移先でflashから値を受け取る

flashで値を保存

下記のコードでsaveが失敗した際にはflashに格納

    if @career.save
      flash[:notice] = "登録しました!"
      redirect_back(fallback_location: root_path) and return
    else
      flash[:alert] = "登録に失敗しました。" + @career.errors.full_messages.first
      flash[:career] = @career
      redirect_to new_career_path
    end

redirect_toで遷移

redirect_to new_career_path

redirect_toで遷移。これによりurlが変わる。

遷移先でflashから値を受け取る

下記のnewメソッドでflashに値があるときはそれを使うように。

def new
    @career = flash[:career] ? Career.new(flash[:career]) : Career.new
    @aircard = Aircard.find_by(user_id: current_user.id)
  end