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

时间:2017-03-20 21:54:39

标签: ruby-on-rails forms validation

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

问题 - 当render :new在提交表单后未能以正确的方式显示错误时,render :edit.save是否正常?

另外,有没有一种方法可以让polls/newpolls/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

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

enter image description here

1 个答案:

答案 0 :(得分:6)

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

render :new

在这种情况下,您已经告诉rails只是再次呈现new部分。但是,由于您已告知rails要从new操作中呈现create部分内容,因此您会在网址栏中看到/polls,因为/resource_name是rails实现的方式其宁静路由系统的create部分(并且您已经定义了要调用的资源&#34;民意调查&#34;。

回答这个问题:

  

是渲染:新建和渲染:编辑时.save在提交表单后未能以正确的方式显示错误吗?

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

render :new

redirect_to new_poll_path, alert: @poll.errors.full_messages

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

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

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