在Ruby on Rails中保留失败表单提交的URL

时间:2011-07-16 09:40:30

标签: ruby-on-rails

我目前正在通过各种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

我考虑使用重定向而不是渲染'new',但这会导致显示表单错误的问题。 Rails上的某人IRC指示我做一个客户端验证的方法,但这似乎就是避免了这个问题。

3 个答案:

答案 0 :(得分:2)

我的用户注册表单存在类似问题。由于我没有在那里使用RESTful路由,我能够通过以下路由解决它:

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

以新形式:

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

答案 1 :(得分:1)

尝试redirect_to :action => 'new'而不是仅渲染,这将保留网址,但有关错误的信息将会丢失(除非您将其放入flash)。

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

答案 2 :(得分:1)

很抱歉迟到(仅仅6年)参加聚会,但不知何故这似乎与Turbolinks有关。

请参阅这些问题herehere