Rails在验证失败后调用渲染时刷新页面

时间:2016-07-27 19:46:59

标签: ruby-on-rails

所以我有一个控制器动作,如下所示:

def create
  @term = Term.new(term_params)
  if @term.save
    redirect_to(@term)
  else
    render :new
  end
end

验证失败时,将呈现新的操作视图,用户可以看到所做的错误。问题是,这也会将URL更改为localhost:3000/terms,因此当用户出于某种原因想要刷新页面时,rails会希望将该用户重定向到index个页面。有一种简单的方法可以在刷新后让用户保持在new term页面上吗?

我实际上没有index的{​​{1}}页面,因为我不需要它,因此在这种情况下整个情况会引发错误。

3 个答案:

答案 0 :(得分:3)

请考虑到这一点:

您正在查看terms,但与“条款索引”不同。事情是,使用https,在你的“新”行动的路径。索引使用“get”并创建使用“post”。所以,看起来一样但不是。

我认为在您的路径文件中,您需要以明确的方式定义“post”路径。

post "new-term" => terms#new

并且可能在您的控制器中定义:

render new_term_path

答案 1 :(得分:2)

了解当您在render :new操作中执行create时,您实际上并未实际路由并执行new操作,这一点非常重要,您和# 39;简单地渲染 new 模板(即new.html.erb),以便URL反映创建操作的URL(在您的情况下为/terms)。

如果您希望将用户实际路由到/terms/new,则可以redirect_to new_term_path如果保存失败,但这也会阻止您的用户看到验证错误。

由于您提到您实际上并未使用index操作来呈现任何有意义的内容,请让它执行重定向

def index
  redirect_to new_term_path
end

这样,如果用户碰巧刷新了页面,他们就会被重定向回新表单。这不是一般解决方案,但应该在您的具体情况下运作良好。

答案 2 :(得分:0)

实际上有一个修复。将route.rb文件中的resources设为resource。这不会创建索引操作,除非您明确要求它:

resources :posts, :only => [:index, :create, :show]

否则,如果您在routes.rb文件中执行此操作,则不会生成索引操作:

resources :posts

我希望这会有所帮助。