【问题标题】:Rails proper way to render validation errors in controllersRails 在控制器中呈现验证错误的正确方法
【发布时间】:2017-08-12 09:13:14
【问题描述】:

我阅读了有关 Rails 验证的文档,但对如何处理控制器中的错误了解不多。

问题 -- render :newrender :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,但当然是从头开始,没有任何错误。

【问题讨论】:

    标签: ruby-on-rails forms validation


    【解决方案1】:

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

    render :new
    

    在这种情况下,您已经告诉 rails 再次简单地渲染 new 部分。但是,由于您已经告诉 rails 从您的 create 操作中渲染 new 部分,您将在您的 url 栏中看到 /polls,因为 /resource_name 是 rails 如何实现其 restful 路由系统的 create 部分(并且您已将资源定义为“民意调查”。

    回答这个问题:

    render :new 和 render :edit when .save 失败是在提交表单后显示错误的正确方法吗?

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

    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 对象替换为new 或@ 中定义的新对象987654347@ 控制器中的操作。因此,使用render 允许您将带有错误消息的@poll 对象返回给适当的操作,以便可以显示错误消息。

    【讨论】:

    • 哇,非常感谢。我与 rails chart 分享了这个,人们很高兴得知 alert 可以与 redirect_to 结合使用
    • 没问题,很高兴我能帮上忙!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    相关资源
    最近更新 更多