Ruby on rails 回形针上载yml文件
我在通过回形针上传yml文件时遇到问题。以下是我尝试的方法: 在我的模型中,我有:Ruby on rails 回形针上载yml文件,ruby-on-rails,ruby,paperclip,yaml,Ruby On Rails,Ruby,Paperclip,Yaml,我在通过回形针上传yml文件时遇到问题。以下是我尝试的方法: 在我的模型中,我有: has_attached_file :search_config validates_attachment_content_type :search_config, content_type: ['text/yaml', 'application/x-yaml', 'text/x-yaml', 'application/yaml', 'text/plain'] 我认为: <%= form_for @sea
has_attached_file :search_config
validates_attachment_content_type :search_config, content_type: ['text/yaml', 'application/x-yaml', 'text/x-yaml', 'application/yaml', 'text/plain']
我认为:
<%= form_for @search, :html => { :multipart => true } do |f| %>
<fieldset>
<legend>Skills</legend>
<%= hidden_field_tag :type, 'recommendation' %>
<%= f.file_field :search_config %>
<%= f.submit 'Save', class: 'btn btn-primary' %>
</fieldset>
我犯了一个错误
search_config_content_type=>["is invalid"]
当我尝试从控制台创建文件时(我使用的是同一个文件):
它起作用了。这里有什么问题?在您的示例中,您确实以完全不同的方式构建了您的邮件搜索 在控制器中,您将可能是
RecommendationMailingSearch
的内容固定化,并通过传递params[:mailing\u search]
来创建此类对象,该对象似乎不是表单的一部分
在您的手动示例中,实例化类型为MailingSearch
的对象,并将文件
对象设置为搜索配置
很明显,你在做完全不同的事情,你如何期望他们以同样的方式行事
也许通过改进您的问题,使对象类彼此匹配,方法调用更相似,您可以自己找到答案。使用调试器检查控制器中的
参数[:mailing\u search]
我怀疑params[:mailing\u search][:search\u config]。内容类型将是application/octet-stream
,因为.yml文件被视为二进制文件
由于不允许将应用程序/octet流
作为有效的内容类型,因此会出现错误
当您尝试通过控制台时,浏览器不会覆盖内容类型,因此它可以工作
在控制器中,在生成@search
之前,可以使用以下命令将参数中的内容类型重置为文件的MIME类型:
params[:mailing_search][:search_config].content_type = MIME::Types.type_for(params[:mailing_search][:search_config].original_filename).first.content_type
这应该保留text/x-yaml
作为文件的内容类型,您允许它作为有效的文件。鉴于去年对YML文件的解析会导致远程代码执行的一系列安全问题(基本上YML允许嵌入XML,允许嵌入ruby),我会特别确保这是您必须做的。你能还原成像JSON这样不那么危险的格式吗?是的,但这是一个临时特性,它只会在客户端内部使用。你说得对,它可能会让人困惑。推荐MailingSearch是MailingSearch(STI)的一个子类。我对我的问题进行了编辑,以使其更清楚。我尝试了基类和子类。
ms = MailingSearch.new
ms.search_config = File.open('tmp/test.yml')
ms.save
params[:mailing_search][:search_config].content_type = MIME::Types.type_for(params[:mailing_search][:search_config].original_filename).first.content_type