我阅读了有关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
表单显示,但我的路由从polls/new
更改回polls
,并且没有构建任何选项。我也尝试了redirect_to new_poll_path
但当然从头开始并没有显示任何错误。
答案 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
方法失败的错误消息。如果您要将创建操作重定向回new
或edit
操作,则带有错误的@poll
对象将被定义的新@poll
对象替换在控制器中的new
或edit
操作中。因此,使用render
允许您将带有错误消息的@poll
对象返回到相应的操作,以便显示错误消息。