【问题标题】:Switching locale after an invalid POST在无效 POST 后切换区域设置
【发布时间】:2011-07-22 14:24:08
【问题描述】:

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

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

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

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

【问题讨论】:

  • 当前locale 从未存储在会话中?
  • 在 url 中,像这样:www.mydomain.com/en/user/register。
  • @apneadiving,在 URL 中而不是在会话中设置区域设置是许多人的首选,因此对特定 URL 的 GET 请求总是返回相同的内容——在这种情况下使用相同的语言。
  • @Wizard of Ogz:我总是使用兼性语言环境来做这两件事。所以我想我们同意
  • @apneadiving 非常好,下次使用语言环境时我会记住这一点

标签: javascript ruby-on-rails devise


【解决方案1】:

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

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

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

不过,这样做的工作量更大。

您可以随时为有问题的页面禁用区域设置。

【讨论】:

    【解决方案2】:

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

    你不能用javascript访问当前响应的HTTP方法。

    【讨论】:

      【解决方案3】:

      @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
      

      【讨论】:

        猜你喜欢
        • 2015-07-19
        • 1970-01-01
        • 2010-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-28
        • 1970-01-01
        相关资源
        最近更新 更多