【问题标题】:Retaining a URL on a failed form submission in Ruby on Rails在 Ruby on Rails 中保留表单提交失败的 URL
【发布时间】:2011-07-16 09:40:30
【问题描述】:

我目前正在学习各种 Rails 教程,但似乎都建议失败的表单提交应该使用渲染来输出带有错误的表单。例如,create 方法如下所示:

def create
  @user = User.new(params[:user])
  if @user.save
    flash[:success] = "Welcome to the Sample App"
    redirect_to @user
  else
    @title = "Sign up"
    render 'new'
  end
end

这达到了预期的效果,但意味着如果我在http://localhost:3000/users/new 有一个新的用户表单并且发生错误,我会在http://localhost:3000/users 得到相同的表单并出现错误

有没有办法确保我转到http://localhost:3000/users/new

我考虑过使用重定向而不是渲染“新”,但这会导致显示表单错误时出现问题。 Rails IRC 上的某个人向我介绍了一种进行客户端验证的方法,但这似乎避开了这个问题。

【问题讨论】:

  • 我真的不明白为什么这种行为是个问题。
  • 我确定这只是我,但它似乎不正确。不太可能和假设的情况,但是如果有人给我发一封电子邮件说“我收到了不应该出现在这个页面上的错误:”然后复制并粘贴了 URL,该怎么办?

标签: ruby-on-rails


【解决方案1】:

我的用户注册表单也有类似问题。由于我在那里不使用 RESTful 路由,因此我可以通过以下路由解决它:

resources :users, :except => [:new, :create] do
  ...
end
get  "/signup" => "users#new"
post "/signup" => "users#create"

并以新的形式:

form_for @user, :url => signup_path do ...

【讨论】:

  • 谢谢!想知道是不是路由问题。可以尝试一下,但看起来应该可以解决它!
【解决方案2】:

试试redirect_to :action => 'new',而不是仅仅渲染,这样会保留url,但是错误信息会丢失(除非你把它放在flash中)。

另一种选择是将表单提交到用于显示它的 URL。在操作开始时,您检查是否有一些数据需要处理。如果处理顺利,你 redirect_to 在其他地方,否则你什么都不做 - 表单会显示,连同所有错误。我想,这不是非常 Railsy,但它应该可以按您的意愿工作。

【讨论】:

  • 谢谢!第二个选项有帮助。我知道它不一定是 Rails-y,但它至少应该解决这个问题。
【解决方案3】:

很抱歉迟到(仅仅 6 年)参加聚会,但不知何故这似乎是 Turbolinks 的问题。

查看这些问题herehere

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    相关资源
    最近更新 更多