capistrano3のupload!で『Encoding::CompatibilityError: incompatible character encodings: ASCII-8BIT and UTF-8』エラー

capistranoのタスクでディレクトリ内のファイルをリモートに上げる処理を↓のように書いていたところ

# lib/capistrano/tasks/uploads.rake

namespace :uploads do
  task :wpuploads do
    ask(:upload_path, nil)
    on roles(:web) do
      upload!('wp-content/uploads/', "/var/www/html/app_name/shared/wp-content/uploads/", via: :scp, recursive: true)
    end
  end
end

しばらくは順調に進んでいたのですが、一部の日本語ファイルをアップロードしようとした時このようなエラーが出てしまいました

(Backtrace restricted to imported tasks)
cap aborted!
Encoding::CompatibilityError: incompatible character encodings: ASCII-8BIT and UTF-8
/Users/user_name/chef/app_name/lib/capistrano/tasks/uploads.rake:18:in `block (3 levels) in '
Tasks: TOP => uploads:wpuploads
(See full trace by running task with --trace)

net-scpで起きるエラーのようで、下記のようにforce_encodingを追加したら問題なく進むようになりました。

# lib/capistrano/tasks/uploads.rake

module Net
  module SSH
    class Buffer
      def write(*data_list)
        data_list.each do |data|
          @content << data.dup.force_encoding('ASCII-8BIT')
        end
        self
      end
    end
  end
end

namespace :uploads do
  task :wpuploads do
    ask(:upload_path, nil)
    on roles(:web) do
      upload!('wp-content/uploads/', "/var/www/html/app_name/shared/wp-content/uploads/", via: :scp, recursive: true)
    end
  end
end

書く場所はもう少し工夫しないといけないな...

ActiveAdminでリレーション先のIDを検索する

kind -> question -> userとそれぞれ1対1で関連付けされている時、いつも通り

filter :user, as: :numeric

と書いてもuserモデルを検索できません。

filter :question_user_id, as: :numeric

のように書けば関連先のuser_idで検索することが出来ます。 また、kindが複数のquestionを持つ時は複数形にすればよさそうです(未検証)

filter :questions_user_id, as: :numeric

Railsでマルチスレッドを使用した場合に RuntimeError: Circular dependency detected while autoloading constant エラーがでる

サイト移行しました

blog.kozakana.net