Есть ли жемчужина rails для использования одной таблицы для всех опций в нескольких входах select в приложении?

Итак, иногда вам просто нужен список опций для вашего выбора. Есть ли простой драгоценный камень, который позволяет легко использовать одну таблицу для всех типов опций, которые могут быть в вашем приложении?

Эта таблица, вероятно, будет выглядеть так:

id  | type   | value  | label
01  | color  | red    | Red
02  | color  | black  | Black
03  | shape  | circle | Circle
04  | shape  | square | Square
05  | state  | texas  | Texas

Например, список стран, список штатов, список цветов, список месяцев и т. д.

Затем при использовании выбора:

select_tag :color, options_for_colors

Затем он заполнит выбор параметрами со значениями/метками из некоторой таблицы параметров, где строки имеют тип: цвет.

Это было бы достаточно легко свернуть самостоятельно, но я не хочу тратить время, если он уже построен.

обновить

Я бы хотел, чтобы это была динамическая таблица, чтобы конечный пользователь мог добавлять/удалять элементы из таблицы параметров выбора.


person jakeonrails    schedule 17.03.2011    source источник


Ответы (2)


Я всегда использую этот метод,

приложение/модели/user.rb

ROLES = %w[admin author normal]

приложение/просмотры/пользователи/_form.html.erb

<%= f.collection_select :role, User::ROLES, :to_s, :titleize %>
person emrahbasman    schedule 17.03.2011
comment
Спасибо, это довольно кратко, но я искал что-то более динамичное. - person jakeonrails; 17.03.2011

Начиная с Rails 3.2, вот что я делаю в инициализаторе:

ActiveRecord::Base.class_eval do
  def self.types
    Rails.application.routes.routes.select do |r|
      r.defaults[:action]=="index" && r.defaults[:controller]== self.name.to_s.downcase.pluralize
    end.map do |r|
      r.defaults[:type]
    end.compact
  end
end

И в route.rb я сопоставляю действия STI с контроллером родительской модели, потому что я разбираюсь в контроллерах:

  resources :derived_models, :controller => :base_model, :type => "DerivedModel"
  resources :more_derived_models, :controller => :base_model, :type => "MoreDerivedModel"

Теперь Model.types даст вам ["DerivedModel", "MoreDerivedModel"]

person nurettin    schedule 12.11.2012
comment
Похоже, это просто возвращает вам список подклассов STI? Не уверен, как это отвечает на исходный вопрос :( Может быть, я что-то упустил? - person jakeonrails; 13.11.2012
comment
Ну, это решение для одной таблицы для перечисления вариантов Или, может быть, я неправильно понял ваше намерение. - person nurettin; 13.11.2012