1

フォームにドロップダウンが必要です。たとえば、ユーザーは機器の種類を選択しています。ただし、ドロップダウンにない場合は、[新規追加]のオプションが必要です。これをクリックすると、ユーザーが入力する必要のあるフィールドがさらにポップアップ表示されます。

したがって、基本的にフォームが送信されると、EquipmentとEquipmentTypeの2つの新しいモデルオブジェクトが作成されます。

これは可能ですか?

4

2 に答える 2

2

正確に何が必要なのかわからないので、2 つの解決策を示します。

  1. 「新規追加」をクリックすると、複数のフィールドに入力する必要があります。これは、この gem の標準的な状況です: nested_formおよびcocoon

    外観の例: http://railscasts.com/episodes/196-nested-model-form-part-1?view=asciicast

  2. 「新規追加」をクリックして、関連付けに別のオプションを追加したい場合 has_many。この場合、標準の複数選択をそのような動作に変換できます。その質問を見てください: https://stackoverflow.com/questions/2867795/best-jquery-multiselect-plugin、これにはいくつかのプラグインがあります。

    例: http://odyniec.net/projects/selectlist/examples.html

于 2012-08-20T06:43:30.910 に答える
1

私の知る限り、まだ宝石はありません。Equipment、およびの2 つのモデルがあると仮定しますEqipmentType。それぞれに が:nameあり、関連付けによって接続されてbelongs_to/has_manyいます。

私のソリューションは、フォームが送信された後に入力されるattr_accessor :new_equipment_typetoを追加します。Equipment

次に、必要に応じて新しい機器タイプを作成し、機器に接続します。

# app/models/equipment.rb
class Equipment < ActiveRecord::Base
  belongs_to :equipment_type
  attr_accessible :name, :equipment_type_id, :new_equipment_type
  attr_accessor :new_equipment_type

  def new_equipment_type=(val)
    if equipment_type_id.blank?
      write_attribute(:equipment_type_id, EquipmentType.create(name: val).id)
    end
  end

end

# app/models/equipment_type.rb
class EquipmentType < ActiveRecord::Base
  has_many :equipments
  attr_accessible :name
end

フォームには既存の機器タイプのドロップダウンがあり、空白のオプションを選択すると、新しい機器タイプ名の新しい入力が表示されます。

#app/views/equipments/_form.html.haml
= simple_form_for [@equipment] do |f|
  = f.input :name
  = f.association :equipment_type, include_blank: "Add new"
  = f.input :new_equipment_type, input_html: {value: "New equipment type name"}, wrapper_html: {style: "#{if @equipment.equipment_type_id.present? then 'display:none;' else '' end}"}

最後に、新しい機器タイプ フィールドを表示/非表示にする JavaScript:

#app/assets/javascripts/equipments.js.coffee:
@showOrHideNewEquipmentTypeField = (drop_down) ->
  new_equipment_type = $(drop_down).closest('form').find('div.input[class*=new_equipment_type]')
  if $(drop_down).val()
    $(new_equipment_type).slideUp()
  else
    $(new_equipment_type).slideDown()

$ ->
  $('[name*=equipment_type_id]').change ->
    showOrHideNewCategoryField(@)
于 2013-05-15T11:15:00.580 に答える