我在通过回形针上传 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>
在我的 Controller 中:
def create
@search = MailingSearch.new(params[:mailing_search])
if @search.save
redirect_to action: :index, notice: 'Your search was successfully created. Search results will be send via email soon.'
else
render action: :new
end
end
我得到一个错误,那个
search_config_content_type=>["is invalid"]
当我尝试从控制台创建文件时(我使用的是同一个文件):
ms = MailingSearch.new
ms.search_config = File.open('tmp/test.yml')
ms.save
它有效。这里可能有什么问题?
使用调试器检查 Controller 中的 params[:mailing_search]
。
我怀疑 params[:mailing_search][:search_config].content_type
将是 application/octet-stream
因为 .yml 文件被视为二进制文件。
由于您不允许 application/octet-stream
作为有效的内容类型,这就是您收到错误的原因。
当您尝试通过控制台时,内容类型不会被浏览器覆盖,这就是它起作用的原因。
在您的 Controller 中,在构建@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
作为您允许有效的文件的内容类型。
我是一名优秀的程序员,十分优秀!