simple_form_for 具有本地化、范围内的路由和 Mongoid(缺少必需的键:[:id])

simple_form_for with localized, scoped routes and Mongoid (missing required keys: [:id])

我有一个模型 FileType_form.html.haml 部分,我想在我的 new.html.hamledit.html.haml 视图中呈现。

= simple_form_for [:document_manager, file_type] do |f|
    ...

当我在 new 视图中渲染这个部分时,这是有效的,但是当我在 edit 视图中渲染它时,simple_form 尝试将 file_typeid 设置为 locale 参数,如果我的路线。我的路线如下所示:

Rails.application.routes.draw do
  scope '(:locale)', locale: locale: /#{I18n.available_locales.join('|')}/ do
    namespace :document_manager do
      resources :file_types, except: [:show]
    end
  end
end

对于 new 视图生成路由 /en/document_manager/file_types,但是当我尝试访问 edit 视图时,我得到此错误:

No route matches {
  :action=>"update", 
  :controller=>"document_manager/file_types", 
  :format=>nil, 
  :id=>nil, 
  :locale=>#<FileType _id: 550198ca7462720388010000, user_file_id: nil, file_name: "...", description: "...">
} missing required keys: [:id]

如何更改 idlocale 参数为 newedit[=48 设置的正确格式=]?

更新: 第一个可行的解决方案是删除 locale 范围并将语言存储在会话中,但对于 SEO,这将导致重复内容,所以更好的解决方案是使用如下网址:

  • /en/document_manager/file_types
  • /fr/document_manager/file_types
  • /de/document_manager/file_types
  • ...

使用正常路径,有时 rails 过于复杂,在这种情况下,它应该自动使用您正在使用的范围,但是当您尝试使用它时,我只使用了像 /en|es|fr/ 这样的硬编码范围.

如果我是你,我会使用类似的东西:

= simple_form_for document_file_type_path, method: :post do |f|

并使用 2 种不同的形式,尝试对可用的语言环境进行硬编码,例如

scope "(:locale)", :locale => /en|es|fr/ do
  resources :foos
  resources :bars
  ...

编辑

看起来也在等待 3 个参数尝试:

[:document_manager, "locale", file_type]