我不知道你有多少种类型,但我过去只是为不同的类型使用了单独的控制器和视图。这样您就不会创建基类的新对象并尝试设置类型,您只需使用从基类继承的模型。您的资源的每个新/编辑页面都可以在 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