3

Rails 4とpaperclip 4.2.1を使用して次のセットアップを行いました

class Post< ActiveRecord::Base
  has_attached_file :key
  allowed_content_type = ['text/plain',
'text/rtf', 
'text/richtext',
'application/txt',
'application/octet-stream']
  validates_attachment_content_type :key, :content_type => allowed_content_type, :message=> "Only #{allowed_content_type} is allowed"

私はこれを私のapplication.rbに持っています

<body data-controller="<%= controller.controller_path %>" data-action="<%= controller.action_name %>" data-no-turbolink="true">
  <%= content_tag "div", id: "params", data: { params: params } do %>
  <% end %>

ポストコントローラーはシンプル

  def update
  Post.transaction do
      @post.attributes = (artifact_params)
        if @artifact.errors.blank?
        redirect_to(@artifact, :notice => 'Evidence item updated successfully')
      else
        render :action => 'edit'
        raise ActiveRecord::Rollback
      end

他のすべてのファイル タイプで問題なく動作します。バイナリ ファイルを試すとエラーが発生します。これはエラーです:

Encoding::Posts#update の UndefinedConversionError

app/views/layouts/application.html.erb 行番号 58 が発生した場所:

56: <body data-controller="<%= controller.controller_path %>" data-action="<%= 
57: controller.action_name %>" data-no-turbolink="true">
58: <%= content_tag "div", id: "params" , data: { params: params } do %>
59: <%#= params.inspect %>
60: <% end %> 

ログには次のように書かれています:

ActionView::Template::Error ("\xAD" from ASCII-8BIT to UTF-8):
    55: </head>
    56: 
    57: <body data-controller="<%= controller.controller_path %>" data-action="<%= controller.action_name %>" data-no-turbolink="true">
    58:   <%= content_tag "div", id: "params" , data: { params: params } do %>
    59:     <%#= params.inspect %>
    60:   <% end %>
    61:   
  app/views/layouts/application.html.erb:58:in `_app_views_layouts_application_html_erb__387563064_102572910'
  app/controllers/posts_controller.rb:978:in `block in update'
  app/controllers/posts_controller.rb:790:in `update'
 Rendered /home/adminuser/.rvm/gems/ruby-2.1.1/gems/actionpack-4.2.0/lib/action_dispatch/middleware/templates/rescues/_source.erb (15.0ms)
  Rendered /home/adminuser/.rvm/gems/ruby-2.1.1/gems/actionpack-4.2.0/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (7.1ms)
  Rendered /home/adminuser/.rvm/gems/ruby-2.1.1/gems/actionpack-4.2.0/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (1.9ms)
  Rendered /home/adminuser/.rvm/gems/ruby-2.1.1/gems/actionpack-4.2.0/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb within rescues/layout (47.8ms)
Cannot render console with content type multipart/form-dataAllowed content types: [#<Mime::Type:0xa835748 @synonyms=["application/xhtml+xml"], @symbol=:html, @string="text/html">, #<Mime::Type:0xa835608 @synonyms=[], @symbol=:text, @string="text/plain">]
4

1 に答える 1

2

これに丸一日費やした後、これはペーパークリップのバグが原因であることがわかりました。バイナリ ファイルが application/octet-stream にマップされていない場合、ビュー本文で params を json 文字列に変換しようとすると、このエラーが発生します。このエラーを取り除くには、バイナリ ファイル タイプを application/octet-stream にマップする必要があります。

1. config/initializers/ に paperclip.rb を作成します。 2. config/initializers/paperclip.rb に次のコードを配置します。

Paperclip.options[:content_type_mappings] = {
  tc: 'application/octet-stream'
}

ここで、tc はバイナリ ファイルの拡張子です。ただし、拡張子のないファイルがある場合、これがどのように機能するかはわかりません。ペーパークリップの所有者は、ユーザーの負担を軽減するために、これを明確に文書化する必要があります。

于 2015-04-29T14:35:15.713 に答える