フォームにドロップダウンが必要です。たとえば、ユーザーは機器の種類を選択しています。ただし、ドロップダウンにない場合は、[新規追加]のオプションが必要です。これをクリックすると、ユーザーが入力する必要のあるフィールドがさらにポップアップ表示されます。
したがって、基本的にフォームが送信されると、EquipmentとEquipmentTypeの2つの新しいモデルオブジェクトが作成されます。
これは可能ですか?
フォームにドロップダウンが必要です。たとえば、ユーザーは機器の種類を選択しています。ただし、ドロップダウンにない場合は、[新規追加]のオプションが必要です。これをクリックすると、ユーザーが入力する必要のあるフィールドがさらにポップアップ表示されます。
したがって、基本的にフォームが送信されると、EquipmentとEquipmentTypeの2つの新しいモデルオブジェクトが作成されます。
これは可能ですか?
正確に何が必要なのかわからないので、2 つの解決策を示します。
「新規追加」をクリックすると、複数のフィールドに入力する必要があります。これは、この gem の標準的な状況です: nested_formおよびcocoon。
外観の例: http://railscasts.com/episodes/196-nested-model-form-part-1?view=asciicast
「新規追加」をクリックして、関連付けに別のオプションを追加したい場合
has_many
。この場合、標準の複数選択をそのような動作に変換できます。その質問を見てください: https://stackoverflow.com/questions/2867795/best-jquery-multiselect-plugin、これにはいくつかのプラグインがあります。
私の知る限り、まだ宝石はありません。Equipment
、およびの2 つのモデルがあると仮定しますEqipmentType
。それぞれに が:name
あり、関連付けによって接続されてbelongs_to/has_many
います。
私のソリューションは、フォームが送信された後に入力されるattr_accessor :new_equipment_type
toを追加します。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(@)