Rails在控制器中呈现验证错误的正确方法

Has*_*tax 1 forms validation ruby-on-rails

我阅读了有关Rails验证的文档,但没有看到如何处理控制器中的错误.

问题 - 提交表单后是否render :new以及render :edit何时.save失败以显示错误的正确方法?

另外,有没有一种方法可以保持polls/new和polls/edit路由相同,就像最初加载表单时一样?

在我看来,我有@poll.errors.any? ... @poll.errors.full_messages.each do ...块.如果我的控制器中有以下代码,则成功调用这些错误,并且render :new是主要关注点:

class PollsController < ApplicationController    
  def create
    @poll = Poll.create(poll_params)

    if @poll.save
      redirect_to polls_path
    else
      render :new
    end
  end
Run Code Online (Sandbox Code Playgroud)

表单显示,但我的路由从polls/new后面更改为polls并且没有构建任何选项.我也试过redirect_to new_poll_path但当然从头开始并没有显示任何错误.

在此输入图像描述

Mar*_*ark 8

请采用以下方案:用户导航到操作中的表单new,输入一些数据,然后按"提交".默认情况下(即假设您正在使用restful路由),rails会将您的表单提交给create控制器中的操作.假设用户输入了一些不正确的数据并导致@poll.save失败.在您的情况下,此代码将运行:

render :new
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您已经告诉rails只是new再次渲染部分.但是,由于您已经告诉rails new从您的create操作中呈现部分,您将/polls在您的网址栏中看到,因为/resource_namerails是如何实现create其restful路由系统的一部分(并且您已将您的资源定义为"民意调查").

要回答这个问题:

渲染:new和渲染:当.save在提交表单后未能以正确的方式显示错误时进行编辑?

简短的回答是肯定的.在rails中,这通常是向在表单中输入错误数据的用户显示错误的首选方式.但是,如果您想在表单提交失败后确保/edit或/new在URL栏中,则需要替换:

render :new
Run Code Online (Sandbox Code Playgroud)

同

redirect_to new_poll_path, alert: @poll.errors.full_messages
Run Code Online (Sandbox Code Playgroud)

此解决方案将导致@poll对象中的错误显示在Flash消息区域中(假设您已设置该错误).但是,我个人并不喜欢这种解决方案,因为闪存消息通常不会以这种方式使用.这引出了一个问题:

为什么我不能@poll.errors.full_messages在重定向后使用?

原因是因为您的@poll对象(在创建操作中)携带错误消息.一旦@poll.save失败,您的@poll对象将携带导致该.save方法失败的错误消息.如果要将创建操作重定向回到new或edit操作,则@poll具有错误的对象将被控制器中@poll的new或edit操作中定义的新对象替换.因此,使用render允许您将@poll带有错误消息的对象返回到相应的操作,以便可以显示错误消息.