rails

Kubernetes を利用時、大きいデータサイズの画像を複数回POSTするとエラーが出る

Rails を用いて、画像アップロードをするシステムを作っていた時、画像を連続3回アップロードすると502エラーが出る場合があった。これは、メモリの使用量が大きくなり、pod 内のプロセスがkill されていたことが原因だった。 Ruby on Rails のメモリ消費が…

Rails で Base64 エンコードされた文字を Carrierwave で保存する最も良い方法

File クラスを使うと、ストレージの読み書きが発生し、速度が落ちるため、メモリ上だけで処理を行う方針。 File クラスと同じ処理をするため、メソッドを定義する。 class StringFileIO < StringIO def self.create_from_canvas_base64 str return nil if st…

ActiveAdmin で、belongs_to, accepts_nested_attributes_for を設定したmodelも同時に表示・編集する

ActiveAdmin で、belongs_to, accepts_nested_attributes_for を設定したmodelも同時に表示・編集する ActiveAdmin.register UserLogin do # ... form do |f| f.inputs nil, for: [:user, f.object.user || User.new] do |fc| fc.input :icon fc.input :full…

nginx Rails Mysql の構成で、アクセス負荷に耐えるためとりあえずやっておくこと

Too many open files nginx (/etc/nginx/nginx.conf) # CPU と同じ数 worker_processes 8; # worker_connections の 4倍程度 # failed (24: Too many open files) に対処できる。 worker_rlimit_nofile 40960; events { # とりあえずこの値 worker_connectio…

safari 使用時、ActiveAdmin で iframe を入力した文字があると、data:, というページにリダイレクトする

ActiveAdmin のバグです。 ActiveAdmin.register Hoge do controller do before_filter :disable_xss_protection def disable_xss_protection response.headers['X-XSS-Protection'] = "0" end end end こうします。

Whenever の schedule.rb 内の設定を環境ごとに変える

$ bundle exec whenever --update-crontab appname --set environment=productionこのように処理を実行した時、schedule.rb の中では、ENV['RAILS_ENV'] で取得できない。$ config/schedule.rb require File.expand_path(File.dirname(__FILE__) + "/environ…

Capistrano3 でRailsをデプロイするとき、current_path, shared_path などを正しく取得する

$ config/deploy.rb # config valid only for current version of Capistrano lock '3.4.0' set :application, 'hoge' set :repo_url, 'git@bitbucket.org:hoge/hoge.git' # Default value for :scm is :git set :scm, :git # set :rbenv_ruby, '2.2.1' # De…

Carrierwave で 独自のversion ファイルを保存する

例えば、wav ファイルを 保存したときに、別バージョンとして mp3 も保存するような場合。 version :mp3 do process :convert_mp3 # この名前が、最終的なファイル名になる。 # デフォルトで、 mp3_****.wav になっているので、リネーム def full_filename f…

Rails で Base64 エンコードされたデータを Carrierwave で保存する

class Api::FilesController < Api::ApplicationController def create # file = params[:data] data_str = params[:data_str] file = File.new # file.data = data file.data_str = data_str end end class File < ActiveRecord::Base mount_uploader :data…

CarrierWave で mp3 保存時に 音の長さを保存する

Mp3Info は、パス指定でなければ利用出来ないので、 current_path によって、一時ファイルを開き直している。 class ItemDataUploader < CarrierWave::Uploader::Base include CarrierWave::MimeTypes storage :fog process :set_content_type process :chec…

Rails で、データベースと表示される時間を日本時間にそろえる

Rails は、内部の日時をUTCで管理しているため、 DBに保存された時間と、表示される時間が異なります。$ config/application.rb config.active_record.default_timezone = :local config.active_record.time_zone_aware_attributes = false config.time_zone…

ActiveAdmin 検索メニューをカスタマイズ

いらない項目だけ非表示にする remove_filter :user 既存を残し、必要な物を追加する preserve_default_filters! filter :created_at, as: :date_range 条件によって項目を出す。 false の時は、デフォルトで表示される場合も、非表示になる filter :hoge, :…

ActiveAdmin で複合プライマリーキーを使う

composite_primary_keys の gem をインストールするmodel に、主キーを配列で指定、display_name も指定 class Hoge < ActiveRecord::Base self.primary_keys = :user_id, :teacher_id def display_name "#{self.user_id}, #{self.teacher_id}" end end これ…

ActiveAdmin で Undefined method ***s_url for #<Admin::***sController>

before_create do # hoge end この中の処理が原因だった。

プログラムから動的に mp3 file を返すとき、safari で再生されない

携帯電話などではお馴染みだが、Rangeヘッダーがついている場合は、 206 のステータスで部分的に返す必要がある。safari でだけ再生されなかったが、 返しているデータバイト数が1バイト足りないためだった。 def main # 何かの方法で読み込む bin = load se…

Rails4 ActiveAdmin

Rails4 では ActiveRecord で更新可能なフィールドを指定する方法が変わった。 以前までの、 attr_accessible :name, :title これは使わなくなった。今後は、コントローラーでアクセスできるフィールドを指定するようになる。 ActiveAdmin.register User do …

Cloudn の Object Storage を Rails の Carrierwave で S3 の代わりに使用する

endpoint を定義すれば良い。 設定ファイルを独自に作成。 管理コンソールの、アカウント / セキュリティー証明書 の所に、 アクセスキーIDとシークレットキーは書かれている。自分は以下のように定義して使用しています。$ vi config/carrierwave.yml devel…

unicorn サブディレクトリで起動する

設定追加 ./config.ru # This file is used by Rack-based servers to start the application. require ::File.expand_path('../config/environment', __FILE__) map ENV['RAILS_RELATIVE_URL_ROOT'] do run MyAppName::Application end 公開用のディレクト…

アプリケーションで認証後にS3のコンテンツを返す

Rails の controller 側 class DownloadController < ApplicationController def action # 認証処理 ... resource_id = 2 resource = Resource.find resource_id response.header['X-Accel-Redirect'] = '/reproxy' response.header['X-Reproxy-URL'] = reso…

whenever 使い方メモ

登録 bundle exec whenever --set environment=test --update-crontab削除 bundle exec whenever --set environment=test --clear-crontab

Redis install error

yum install make yum install gcc-c++ wget http://redis.googlecode.com/files/redis-2.6.9.tar.gz tar -xf redis-2.6.9.tar.gz cd redis-2.6.9 make #error "Newer version of jemalloc required"このようにでてmake できない場合は、 make distclean make…

ActiveRecord で Trigger を使用する

hair_trigger というgem があったがエラーが出て機能しなかった。execute メソッドで直接SQLを実行することになる。migrate 実行順が影響するので、migration ファイルを別に作成 $ ./script/rails g migration trigger_photos たとえば以下のようにsqlを流…

carrierwave で処理後の画像サイズを取得する

image を セットしたとき、同時にカラムにサイズを保存する処理 class PhotoImageLargeUploader < CarrierWave::Uploader::Base include CarrierWave::RMagick ... process resize_to_fit: [100, 100] process convert: 'jpeg' process :hoge def hoge # rma…

ruby で html アンエスケープ

install $ vim Gemfile 追加 gem "htmlentities" $ bundle install 使い方 puts HTMLEntities.new.decode "&#9834;"

ruby on rails 管理ページ生成

Active Admin を使う場合。 install の順番を間違えると、エラーが出る gem に追加 $ vim Gemfile gem 'activeadmin' $ bundle install インストール $ rails g active_admin:install モデル作成 $ rake db:migrate RAILS_ENV=development --trace 管理でき…

rails をインストール

rvm ruby マネージャ https://rvm.io/rvm/install/ (参考サイト) バージョンマネージャを使ってインストールする。 $ curl -L get.rvm.io | bash -s stable $ source /etc/profile.d/rvm.sh $ echo source /etc/profile.d/rvm.sh >> ~/.bashrc 必要なライブ…