2012-04-24 82 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