Ruby on rails 回形针上载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

我在通过回形针上传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 @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