【问题标题】:Rails 4, Simple Form - language selectionRails 4,简单形式 - 语言选择
【发布时间】:2016-04-20 22:33:33
【问题描述】:

我正在尝试使用 Rails 4 制作应用程序。我使用简单的形式。

我有一个表格要求用户选择他们的工作语言。

 <%= f.input :working_languages, as: :select, collection: AVAILABLE_LANGUAGES.sort.map {|k,v| [v,k]}, label: "Select your working language" %>

我的 config/initializer 文件夹中还有一个 available_languages.rb

AVAILABLE_LANGUAGES = {
    en: "English", 
    de: "Deutsche", 
    fr: "Français", 
    es: "Español"
}

当我尝试这样做时,我得到了这个错误。有谁知道是什么意思吗?

NameError in Profiles#edit
profiles/_form.html.erb where line #39 raised:

uninitialized constant ActionView::CompiledTemplates::AVAILABLE_LANGUAGES

【问题讨论】:

  • 您能否粘贴您 available_languages.rb 的完整代码
  • 这是整个文件

标签: ruby-on-rails collections simple-form


【解决方案1】:

config/initializers/language_array.rb

module LanguageArray
  AVAILABLE_LANGUAGES = {
    en: "English", 
    de: "Deutsche", 
    fr: "Français", 
    es: "Español"
}
end

并以如下形式访问:

<%= f.input :working_languages, as: :select, collection: LanguageArray::AVAILABLE_LANGUAGES.sort.map {|k,v| [v,k]}, label: "Select your working language" %>

【讨论】:

  • 未初始化的常量 ActionView::CompiledTemplates::LanguageArray
  • 你重启服务器了吗?
  • 重命名初始化程序修复了它,除了 输出 'en' 而不是 'english'
  • &lt;%= LanguageArray::AVAILABLE_LANGUAGES[@profile.working_languages].to_sym %&gt; 试试这个
  • 试试这个&lt;%= LanguageArray::AVAILABLE_LANGUAGES[@profile.working_languages.to_sym] %&gt;
【解决方案2】:

更好的方法是将其放入帮助程序和use this for your constant(在您的视图中可用):

#config/initializers/global_constants.rb
module GlobalConstants
    # also notice the call to 'freeze'
    LANGUAGES = {
       en: "English", 
       de: "Deutsche", 
       fr: "Français", 
       es: "Español"
    }.freeze
end

#app/helpers/application_helper.rb
module ApplicationHelper
   def available_languages
       GlobalConstants::LANGUAGES
   end
end

然后您就可以使用:

<%= f.collection_select :working_languages, available_languages, :first, :last, label: "Select your working language" %>

【讨论】:

  • 嗨 Rich,恐怕我无法猜测为什么这会更好。我认为你的技能可能比我能跟上的更先进。阅读此内容:rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/…,我不确定为什么要冻结用户的语言选项。恐怕,我想不出这种方法的优势是什么。无论如何,谢谢 - 我会用我所拥有的。
  • 你冻结了常量。我只是从参考答案中获得了这个想法;我觉得很好。常量不能改变,变量可以。因此,如果您要声明一个常量,则无论如何都无法更改它。
  • 真的不知道这意味着什么。我认为你太先进了,我无法理解这一点。我不介意用户是否更改他们选择的语言,如果这就是您所指的。还是谢谢。
  • Constants and variables 是编程的基本组件。您将 AVAILABLE_LANGUAGES 声明为常量。常量不变,变量可以。使用您的选择表单,您可以通过从常量中选择来更改变量 working_languages
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多