Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 渲染背后的基本原理:新建而不是将_重定向到新建以进行后期创建?_Ruby On Rails_Rest - Fatal编程技术网

Ruby on rails 渲染背后的基本原理:新建而不是将_重定向到新建以进行后期创建?

Ruby on rails 渲染背后的基本原理:新建而不是将_重定向到新建以进行后期创建?,ruby-on-rails,rest,Ruby On Rails,Rest,给定一个rails RESTful控制器 class WidgetsController def new @widget = Widget.new end def create @widget = Widget.new(params[:widget]) render :new and return unless w.save redirect_to widget_path(@widget) end end 除了捕获参数和呈现验证消息之外,如果

给定一个rails RESTful控制器

class WidgetsController
  def new
    @widget = Widget.new
  end

  def create
    @widget = Widget.new(params[:widget])
    render :new and return unless w.save

    redirect_to widget_path(@widget)
  end
end
除了捕获参数和呈现验证消息之外,如果验证失败,为什么要使用
render:new
而不是
redirect\u to new\u widget\u path


由于URL将从
/widgets/new
更改为
/widgets
,如果验证失败,这是否打破了REST的概念?

render的问题是它不会导致生成另一个请求。它将转到相应的视图并显示它。但是,使用重定向时,将生成对浏览器的重定向请求,这将导致对服务器的另一个请求

Render不会调用控制器操作,因此您在创建操作中设置的实例变量将被带到新视图中

这意味着任何验证错误都会保留在新视图中

将_重定向到将为new运行控制器操作,从而创建模型的新实例。。。而你会失去错误


希望这有帮助

您可以这样做而不是呈现新动作吗

   flash[:thing] = params[:thing]
   redirect_to new_thing_path
然后在纽约

   @thing = Thing.new(flash[:thing] || params[:thing])
老实说,这对我来说似乎更好,因为如果你的控制器中有任何逻辑需要呈现新的/编辑操作,你必须在更新/创建中重复该逻辑(或在过滤器之前创建一些逻辑或其他)。我意识到这还涉及到一个请求,但除此之外,编写代码似乎更简单、更安全(除了打破rails惯例的事实),并且它为用户提供了一个有效的url,该url在查看/执行相同的操作时总是相同的

如果刷新,它们将丢失其值,但在提交之前的任何表单都是如此。对我来说,这似乎比让人耳目一新更有意义,这导致了一个非常奇怪的重新提交的警告。例如,用户应该如何清除表单


这个问题一直困扰着我。有没有我没有考虑的严重问题?其他应用程序框架是否都这样做?

如果重定向,则会丢失params数组,并且无法在字段中预填充值。如果存在重定向,我理解会丢失params哈希。我想知道的是,除了这个原因,还有什么其他的原因可以让我休息吗?(如果它完全打破了它)