【问题标题】:Rails: Locales using form_with?Rails:使用 form_with 的语言环境?
【发布时间】:2018-10-15 11:23:21
【问题描述】:

如何使用语言环境和form_with?语言环境是指/en 而不是/?locale=en

这是我的视图文件的一部分:

<%= form_with(model: @model, local: true, locale: I18n.locale) do |form| %>

提交表单后出现以下错误:

No route matches {:action=>"show", :controller=>"model_name", :format=>nil, :locale=>#<ModelName id: 2, created_at: "2018-10-15 11:07:36", updated_at: "2018-10-15 11:08:09">}, missing required keys: [:id], possible unmatched constraints: [:locale]

注意给定模型的区域设置...

这是我的routes.rb

root 'model_name#new'

scope ':locale', locale: /[a-z]{2}/ do
  root 'model_name#new'
  resources :model_name, only: [:create, :show]
end

我不明白为什么我需要设置两次 root 但是...

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby forms ruby-on-rails-5 locale


    【解决方案1】:

    root inside of scope 表示范围的根。

    例子:

    root # matches / 
    scope ':locale' do
      root # matches /en/
      resources :foos # matches /en/foos, /en/foo/1, ...
    end
    

    我建议你打电话给rake routes 看看你已经定义了哪些路线并玩了一下。

    回到你得到的错误。此错误意味着范围的约束不匹配。我敢打赌,语言环境是空的。 根据form_withdocs,您应该使用范围选项,如下所示:

    <%= form_with(model: @model, local: true, scope: I18n.locale) do |form| %>
    

    【讨论】:

    • scope这里其实还有一个用处,它会对表单传递的参数进行命名。您的建议将创建一个 locale[:field_name],我认为这不是 OP 正在寻找的。​​span>
    【解决方案2】:

    Rails 正在使用您的 ModelName 实例,因为未设置区域设置。 为确保您的语言环境设置在 urls 中,请将default_url_options 方法添加到application_controller,其中set_locale 包含应用程序语言环境的逻辑。

    def default_url_options
       { locale: set_locale }
    end
    
    private def set_locale
      params[:locale] || I18n.default_locale
    end
    

    来源:https://guides.rubyonrails.org/i18n.html#managing-the-locale-across-requests

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-09
      • 2023-03-09
      • 2017-03-20
      • 2016-05-23
      相关资源
      最近更新 更多