あなたがいくつのタイプを持っているかはわかりませんが、過去にさまざまなタイプに別々のコントローラーとビューを使用しただけです。この方法では、基本クラスの新しいオブジェクトを作成して型を設定しようとせず、基本クラスから継承したモデルを使用するだけです。リソースの各新規/編集ページは、form_for ブロックで共有パーシャルをレンダリングできます。パーシャルには file_field が含まれます。
このようにして、フォームが送信されると、正しいコントローラーに送信され、正しい resource.new が呼び出され、すべて問題ありません。
もちろん、欠点はより多くのファイルであり、「新しいファイルを追加する」にリンクしているページには、「このタイプのファイルを新しく追加する」、「そのタイプのファイルを新しく追加する」などの複数のリンクを追加する必要があります。
フォームのタイプの設定については、それが機能するかどうかわかりませんが、疑わしいですが、試してみてください(お知らせください)。そのタイプを select_tag ドロップダウンにし、変更時に Javascript を使用してフォーム上のアクションの場所を変更することができます。
基本的な回避策を編集および追加
私はこのソリューションが好きというわけではありませんし、それが決して最善であるとは思えませんが、別々のコントローラーが本当に必要なく、それを機能させる必要がある場合は、次のようにすることができます:
class XmlFile < ActiveRecord::Base
end
class XmlFileTypeA < XmlFile
end
class XmlFileTypeB < XmlFile
end
def create
# Leaving this case statement in the controller for simplicity but you probably want to move this to the model
case params[:chosen_xml_type]
when "file_type_a"
@item = XmlFileTypeA.new(params)
when "file_type_b"
@item = XmlFileTypeB.new(params)
else
raise "Unknown file type!"
etc
end
end