Javascript 在无效POST之后切换区域设置

Javascript 在无效POST之后切换区域设置,javascript,ruby-on-rails,devise,Javascript,Ruby On Rails,Devise,我对以下问题感到困惑:在我的web应用程序中,用户可以从下拉框中选择他们的语言。选择后,一段Javascript获取当前url,用新的区域设置字符串替换其中的旧区域设置子字符串,并将window.location设置为新url。只要URL是GET请求的结果,这就非常有效 我的问题发生在用户发布表单并返回验证错误时。该url现在是一个POST url,在我的例子中,它不适用于GET请求。因此,如果用户现在决定切换语言,将向服务器发送无效的GET请求 有什么办法解决这个问题吗 更具体地说:我在Des

我对以下问题感到困惑:在我的web应用程序中,用户可以从下拉框中选择他们的语言。选择后,一段Javascript获取当前url,用新的区域设置字符串替换其中的旧区域设置子字符串,并将window.location设置为新url。只要URL是GET请求的结果,这就非常有效

我的问题发生在用户发布表单并返回验证错误时。该url现在是一个POST url,在我的例子中,它不适用于GET请求。因此,如果用户现在决定切换语言,将向服务器发送无效的GET请求

有什么办法解决这个问题吗


更具体地说:我在Desive 1.4.2注册表单上的Rails 3.0.9中遇到了这个问题,您可以使用javascript检查页面上是否有.fieldWithError类元素。如果是这样,您可以确定最后一个请求是POST。在这种情况下,您必须更改表单的“action”属性,更改区域设置并再次提交


您无法使用javascript访问当前响应的HTTP方法。

我经常编写自己的路由,以避免您描述的确切问题。我认为这是Rails路由中的一个大缺陷

您可以更改设计路由和其他资源路由,以便GET和POST URL看起来相同。这里有一个例子来说明我的意思

  scope '/posts' do
    get '/:id/edit' => "posts#edit", :as => "edit_posts"
    post '/:id/edit' => "posts#update", :as => "update_posts"
  end
不过,用这种方式做事需要做更多的工作


对于有问题的页面,您可以随时禁用区域设置选择。

@wizadofogz感谢您让我走上正轨。我添加了这个答案,这样我可以粘贴一些代码,我不能在评论中粘贴,但我会接受你的答案

我找到了。我已经在密码重置路由上对其进行了测试,这似乎工作正常,尽管我想这还没有完成:

devise_for :user, :path_names => { :sign_up => "register", :sign_in => 'login', :sign_out => 'logout' }, :skip => [:passwords] do
  scope :controller => 'devise/passwords' do      
    post :create, :path => 'user/password/new', :as => :user_password
    get  :new, :path => 'user/password/new' , :as => :new_user_password
  end
end

当前区域设置从未存储在会话中?它位于url中,如:www.mydomain.com/en/user/register@apreading,许多人都喜欢在URL中而不是在会话中设置区域设置,以便对特定URL的GET请求总是返回相同的内容—在本例中使用相同的语言。@Ogz向导:我总是使用临时区域设置同时执行这两项操作。所以我想我们agree@apneadiving太好了,下次我在使用本地语言环境时会记住这一点