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) %>ます。ただし、選択するオプションとして 3 番目のパラメーターを使用します。

うまくいけば、これは少なくとも何らかの意味を持ちます!

英語での説明

  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

このハッシュをsite get 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
于 2012-04-24T20:52:58.877 に答える