gpt4 book ai didi

ruby-on-rails-3 - Rails 中处理无效表单提交的正确方法

转载 作者:行者123 更新时间:2023-12-03 00:52:07 24 4
gpt4 key购买 nike

我是 Rails 新手,不确定我是否同意我在一些教程中完成的工作方式。该问题与如何处理无效的表单提交有关。标准的做事方式似乎是:

class ThingsController < ApplicationController


# POST /things
def create

@thing = Thing.new(params[:thing])

if @thing.save
flash[:notice] = 'Thing created'
redirect_to(@thing)
else
render :action => :new
end

end

当 @thing.save 失败时,用户会看到相同的表单,预先填写了他刚刚输入的值,并闪现出了问题所在。到目前为止一切都很好,只是现在 URL 已从/things/new 更改为 things/,而人们希望改为渲染索引 View 。

此外,如果用户刷新页面,他现在正在查看索引 View 。如果他点击返回,系统会提示他重新提交表单,这是我一直试图避免的。如果我重定向到(new_thing_path),用户之前的提交就会丢失,错误消息也会丢失。

我意识到,RESTful 中,此方法可能是“正确的”,因为事物对象的创建应该是 POST 到/things 的结果,但从用户界面角度来看,我并不特别关心它。

我可以“手动”将无效的 @thing 对象保存在用户 session 中,以便在我将他重定向回 new_thing_path 后显示,但这感觉就像是黑客攻击。似乎应该有一种“轨道方式”来做到这一点。

想法?

最佳答案

正如您所发现的,默认情况下,当您指定 resources :things 时,用于创建新事物的 POST 路径位于 /things。以下是rake 路线的输出:

    things GET    /things(.:format)          {:action=>"index", :controller=>"things"}
POST /things(.:format) {:action=>"create", :controller=>"things"}
new_thing GET /things/new(.:format) {:action=>"new", :controller=>"things"}
edit_thing GET /things/:id/edit(.:format) {:action=>"edit", :controller=>"things"}
thing GET /things/:id(.:format) {:action=>"show", :controller=>"things"}
PUT /things/:id(.:format) {:action=>"update", :controller=>"things"}
DELETE /things/:id(.:format) {:action=>"destroy", :controller=>"things"}

听起来你想要更多类似这样的东西:

create_things POST   /things/new(.:format)      {:action=>"create", :controller=>"things"}
things GET /things(.:format) {:action=>"index", :controller=>"things"}
new_thing GET /things/new(.:format) {:action=>"new", :controller=>"things"}
edit_thing GET /things/:id/edit(.:format) {:action=>"edit", :controller=>"things"}
thing GET /things/:id(.:format) {:action=>"show", :controller=>"things"}
PUT /things/:id(.:format) {:action=>"update", :controller=>"things"}
DELETE /things/:id(.:format) {:action=>"destroy", :controller=>"things"}

虽然不推荐,但您可以通过以下途径获得此结果:

resources :things, :except => [ :create ] do
post "create" => "things#create", :as => :create, :path => 'new', :on => :collection
end

您还需要修改表单以使其 POST 到正确的路径。

尽管如此,您问题中的网址描述听起来并不正确。您列出以下内容:提交新的 thing 后(在 /things/new 提交表单),

  1. 网址从 /things/new 更改为 /things
  2. 点击返回提示重新提交表单
  3. 刷新显示 things#index

不是我在自己的 Rails 3 应用程序中体验到的功能。相反,我发现:提交新的 thing (在 /things/new 提交表单)后,

  1. 网址从 /things/new 更改为 /things(这是相同的)
  2. 点击返回会将用户返回到提交的表单(不请求重新发布)
  3. 刷新提示重新提交表单(正如我认为的那样)

关于ruby-on-rails-3 - Rails 中处理无效表单提交的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5047136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com