Я не знаю, сколько у вас типов, но я просто использовал отдельные контроллеры и представления для разных типов в прошлом. Таким образом, вы не создаете новый объект базового класса и не пытаетесь установить тип, вы просто используете модель, которая наследуется от базового класса. Каждая новая страница редактирования ваших ресурсов может отображать общий фрагмент в блоке 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