基于YML / DB的Rails复选框/表单

时间:2014-07-17 20:40:53

标签: ruby-on-rails forms internationalization yaml

我想创建一个大的复选框区域,可能有大约30个复选框。我希望,而不是硬写每个复选框,从db或翻译yml填充它。如何从yml创建此循环?我猜这是不好的做法?如果是这样,如何循环db值?

1 个答案:

答案 0 :(得分:1)

颜色复选框的示例:

来自YAML:

# controller
def show
  @options = YAML.load(File.read(Rails.root.join('db', 'fixtures', 'checkboxes.yml')))

# view
Check the colors you want:
- @options.each do |option|
  = option
  = check_box_tag 'colors[]', option

# example of received parameters:
params = { colors: [ 'red', 'blue' ] }

# db/fixtures/checkboxes.yml
---
- Blue
- Red
- White
- Black
- Green
- Yellow

这是预定义颜色的静态列表,这意味着您需要手动编辑YML文件并重新启动服务器以查看此列表中的更改。

这是一个缺点吗?是和否,取决于你想做什么。


来自DB:

# controller
def show
  @options = Color.all.map{ |color| [color.name, color.id] }

# view
Check the colors you want:
- @options.each do |option_name, value|
  = option_name
  = check_box_tag 'colors[]', value

# example of received parameters:
params = { colors: [1,2,3] } # ids of Color records

这是一个颜色的动态列表,可以通过Web界面轻松维护(无需重启服务器)。您可以对这些操作执行基本的CRUD(创建检索更新删除)操作,而YAML文件无法轻松处理(可以在运行时重写和重新加载文件但是在比较中哇哇哇哇使用Color模型进入" Rails'方式"


从I18n的翻译文件中加载:

# implying that en.posts.colors is a list of color names
en:
  # ...
  posts:
    # ...
    colors:
      black: Black
      red: Red
      white: White

# view
- t('posts.colors').each do |i18n_key, color_name|
  = color_name
  = check_box_tag 'colors[]', color_name

# example of received parameters:
params = { colors: [ 'red', 'blue' ] }

如何决定?

这取决于您的需求:

  • 您需要列表静态吗? (经典用法:国家,语言,颜色,性别等) - >转到YAML选项
  • 您需要列表动态吗? (经典用法:用户,类别,可在应用内编辑的内容) - >转到“模型”选项