所以我有一个控制器动作,如下所示:
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}}页面,因为我不需要它,因此在这种情况下整个情况会引发错误。
答案 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
我希望这会有所帮助。