我对以下问题感到困惑:在我的网络应用中,用户可以从下拉框中选择他们的语言。选择后,一段Javascript将获取当前url,用新的语言环境字符串替换其中的旧语言环境子字符串,并将window.location
设置为新的url。只要URL是GET请求的结果,这就很有用。
当用户发布表单并返回验证错误时,会出现问题。 url现在是一个POST url,(在我的情况下)不适用于GET请求。因此,如果用户现在决定切换语言,则会向服务器发送无效的GET请求。
任何想法如何解决这个问题?
更具体一点:我在Devise(1.4.2)的注册表格中遇到Rails 3.0.9中的这个问题
答案 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