0

我知道这看起来很疯狂,但我正在尝试做这样的事情:

def site_list
    @sites = []

    Dir.new(base_dir = "./app/sites/").each do |name, idx|
      path = "#{base_dir}#{name}"
      if FileTest.directory?(path) && !name.starts_with?('.')
        @sites << name
      end
    end

    return @sites
  end

陪我度过我的疯狂。

有一个名为 的 URL 参数:site,如果存在,那么我想要一个手动创建的动态下拉列表来选择正确的元素。因此,为此,我需要创建一个关联数组/哈希,它执行 id > name。

一步步:

  1. 列出所有关联 id > name 的目录(id 是编出来的,只是索引)
  2. 根据 :site URL 参数,在选择列表中选择正确的元素
  3. 没有第 3 步。

所以你有:<%= select_tag :sites, options_for_select(site_list) %>但第三个参数作为选择的选项。

希望这至少有一定的意义!

英文说明

  1. 我正在根据文件系统中的文件夹填充一个数组
  2. 该数组用于填充select_tag
  3. select_tag当前选中项是根据当前路由确定的。( :site)
  4. 如果路线不包含:site,则显示select_tag“请选择...”或类似的内容。
4

1 回答 1

1

在选择表单助手中,您实际上可以传递一个哈希,键将显示在选择菜单中,值将是值。所以让@sites 成为一个哈希,就像这样:

class SitesController < ApplicationController
  ...
  @sites = { :site1 => 'stackoverflow', :site2 => 'someothersite' }
  ...
end

因此,要使用站点获取参数过滤此哈希,让我们根据 Hash#keep_if 方法http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-keep_if创建一个助手:

module ApplicationHelper
  def site_list(sites, site)
    sites.keep_if { |name, value| value == site }
  end
end

只需更改块中的条件即可为您工作。表单中的代码如下所示:<%

<% site = 'stackoverflow' %>
<%= site_list(@sites, site).inspect %>
<%= f.select :name, site_list(@sites, 'stackoverflow') %>

没有助手的更好的方法是在控制器中使用 before_filter :

class SitesController < ApplicationController
  before_filter :extract_select_option, :only => :your_action

  protected
  def extract_select_option
    # SITES - all sites readed from file
    @sites = SITES.keep_if { |key, value| value == params[:site] }
  end
end
于 2012-04-24T20:52:58.877 回答