2012-04-24 64 views
0

我知道这看起来疯狂,但我试图做这样的事情:手动填充select_tag Rails中

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>的名称基础上
  2. (ID由,这只是指数)的目录:网站的URL参数,选择正确的元素在选择列表
  3. 没有步骤3

所以你就必须:<%= select_tag :sites, options_for_select(site_list) %>但第三个参数的选项进行选择。

希望这至少有一定意义!

中英文详细说明

  1. 我填充基于文件系统文件夹的数组
  2. 这个数组来填充select_tag
  3. select_tag的当前选择的项目是根据当前路线确定。 (:site
  4. 如果路线不包含:site,然后显示select_tag“请选择...”或沿着这些线路。

回答

1

在选择形式助手中,您实际上可以传递一个散列,并且键将显示在选择菜单中,值将是值。因此,让@sites是哈希,水木清华这样的:

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

因此,为了与网站过滤该散列得到PARAM让创建基于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 
+0

我认为这是我barfing,因为它预期的整数值,这看起来很奇怪。是的,我可以构建哈希,我需要找出一种方法来缓存它(非数据库)。这看起来很棒,我会在几个小时后看看它。 – Kezzer 2012-04-25 08:15:38