POST无效后切换语言环境

时间:2011-07-22 14:24:09

标签: javascript ruby-on-rails devise

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

当用户发布表单并返回验证错误时,会出现问题。 url现在是一个POST url,(在我的情况下)不适用于GET请求。因此,如果用户现在决定切换语言,则会向服务器发送无效的GET请求。

任何想法如何解决这个问题?

更具体一点:我在Devise(1.4.2)的注册表格中遇到Rails 3.0.9中的这个问题

3 个答案:

答案 0 :(得分:1)

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

您可以更改Devise路由和其他资源路由,以便您的GET和POST URL看起来完全相同。这是我的意思的一个例子。

  scope '/posts' do
    get '/:id/edit' => "posts#edit", :as => "edit_posts"
    post '/:id/edit' => "posts#update", :as => "update_posts"
  end

不过,这样做的工作要多得多。

您可以随时禁用有问题的网页的区域设置选择。

答案 1 :(得分:0)

如果页面上有.fieldWithError分类元素,您可以使用javascript进行检查。如果是这样,您可以确定最后一个请求是POST。在这种情况下,您必须更改表单的“action”属性(更改区域设置)并再次提交。

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

答案 2 :(得分:0)

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

我找到了this related post specifically for Devise。我已经在密码重置路由上测试了它,这似乎工作正常(虽然我猜这还不完整):

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