Techioz Blog

Railsがパラメータエラーとしてオブジェクトを送信しない

概要

私は記事を処理するコントローラーを持っており、最近そのように編集および作成アクションを実装しました。

def edit
      @article = Article.find(params[:id])
end

def update
      @article = Article.find(params[:id])

      if @article.update(article_params)
        redirect_to @article
      else
        render :edit, status: :unprocessable_entity
      end 
end

記事を編集しようとすると、次のメッセージが表示されたエラーが発生します: スクリーンショット

このようにフォーム部分を使用してレイアウトをロードしています。

<%= render "form", article: @article %>

新しい記事を保存しようとした後、編集アクションは適切に機能し、要件を満たさずに保存しようとすると本文のエラー メッセージは表示されません。この問題を解決するにはどうすればよいでしょうか? 前もって感謝します。

解決策

レンダリング エラーを処理するには、より良い方法があります。フォーム ビルダーによってラップされたオブジェクトにアクセスするだけです。

<%= form_with(model: article) do |form| %>
  <% if form.object.errors.any? %>
    <ul>
      <% form.object.each do |error| %>
        <li><%= error.full_message %></li>
      <% end %>
    </ul>    
  <% end %>
  # ...
<% end %>

これにより、フォームでラップされたモデル インスタンスに対応する変数の名前を知らなくても、エラー メッセージのレンダリングを DRY で終了できます。

ただし、古典的な nil エラーもあります。@article はおそらく nil です。また、質問にあるコードを額面通りに受け取ると再現できないため、これは私たちが実際に解決できる問題ではありません。 stackoverflow でよくあることですが、実際の問題は画像の外のどこかに潜んでいます。

このコードをデバッグするには、実行していると思われるコードが実際に実行されていることを確認し、一連のブレークポイントを設定して、それが実際に設定され、ビューに正しく渡されていることを確認する必要があります。