「Rails」タグアーカイブ

AngularJS と Rails の form_for を組み合わせる


AngularJS と Rails の form_for を組み合わせて使ってみました。 何より厄介なのは action 属性 が 自動でついてしまうことです。

環境

  • Rails 4.1.8
  • Ruby 2.2.2
  • AngularJS 1.4.7
  • Ubuntu 15.04

状況

Rails の form_for を使うと、 Rails が action 属性 から すべて 設定してくれます。 もちろん、 form タグ の属性を 追加することもできます。 ただし AngularJS を使う上では問題がありました。

問題になるのは次のコードです。

このコードでは、 ボタンをクリックすると AngularJS による処理が実行された後で 本来の form の処理が実行されます。

AngularJS は、 action 属性 がないときは 本来の form の処理を行わないのですが、 Rails で action 属性 が自動でつけられている以上どうしようもありません。 いや、 action 属性 を消す方法があるのかもしれませんが、 私は見つけることができませんでした。

解決法

form タグ に onsubmit="return false;" を付け加えます。

button タグ で type="button" とすると、 ボタンクリック時はどうにか二重処理を防げますが、 入力欄で Enter を押されたときは防げません。

また AngularJS: How to prevent form submission after click on button? に記載されているような方法もありますが、 javascript として 他のところで使えないので、 上に書いたやり方の方がきれいに見えます。


Passenger と Nginx で Rails を動かす インストール手順


Passenger, Nginx で Rails を動かすこととなりました。 しかし、デフォルトのインストール方法ではレスポンスに不要なヘッダが含まれてしまいますので、これを除去するために モジュールを含めて nginx のコンパイル・インストールを行いました。 以下はその記録です。

環境

  • Ruby 2.2.2
  • Nginx 1.8
  • Passenger 5.0.18
  • EC2 Amazon Linux 2015.03

手順

ruby はインストールされているものとして進めます。

  1. Passenger の インストール
  2. Nginx のインストール
    • Nginx 及び 必要なモジュールのダウンロード
    • コンパイル・インストール
  3. nginx の設定
  4. nginx の再起動 (または起動)

Passenger のインストール

gem install passenger を実行して、 Passenger をインストールします。

Nginx のインストール

ここで root 権限 を使って passenger-install-nginx-module とやれば、 nginx のインストールはできます。 nginx のソースをダウンロードしてコンパイルしてくれます。 しかし、その状態だと レスポンスヘッダに Nginx や Passenger の名前・バージョンが出力されます。

そういったヘッダを出力させないために、 モジュールを含めて Nginx をコンパイルする必要があります。

Nginx 及び 必要なモジュールのダウンロード

まずは Nginx と 必要なモジュールをダウンロードします。

sudo su - で root ユーザ に変更して、 cd /usr/local/src を実行します。

Nginx のダウンロード

Nginx (tar.gz形式) をダウンロードします。 このとき最新の安定版だったのは Nginx 1.8.0 でした。 Nginx の公式ダウンロードページからダウンロードできます。

ダウンロードができたら展開しておきます。

headers-more-nginx-module のダウンロード

シンプルな Nginx と Passenger で運用すると、 ヘッダに Nginx や Passenger のバージョン、 処理時間などが出力されます。 サーバの内側の情報をできるだけ外に出さないようにするために、 Nginx では headers-more-nginx-module というのを使って対処します。

こちらのモジュールは github から最新のバージョン(tar.gz形式)のURLを取得します。

リリース一覧ページ : Releases · openresty/headers-more-nginx-module

ダウンロードができたら展開しておきます。

展開後は、展開前のファイル名をわかりやすいものに変更しておきます。 Tab を使えば、 展開後のディレクトリ名を利用して(ある程度)簡単に入力できます。

コンパイル・インストール

インストールの際には 次のものが必要ですので、 ない場合はあらかじめインストールしておいてください。 なかったとしてもメッセージが表示されますので心配はいりません。

  • C コンパイラ (/usr/bin/cc)
  • C++ コンパイラ (/usr/bin/c++)
  • wget または curl
  • SSL をサポートしている curl の development header
  • Openssl development header
  • Zlib development header
  • rake, rack, ruby development header, rubygems

Nginx を過去に同じ場所に同じようにインストールしていた場合は、古い nginx 実行ファイル が nginx.old という名前になります。

スワップ領域

EC2 micro instance などを使っている場合で、 メモリが十分に無い場合(1GB以下の場合)はスワップ領域が必要になります。 root 権限 で次のコマンドを実行します。

メモリが足りないままインストールを実行した場合でも、インストール中に案内が表示されますので心配はいりませんが。

passenger-install-nginx-module を実行します。 特にオプションは必要ありません。

ここからインストールが始まります。

まずは 処理の説明が表示され、 Press Enter to continue, or Ctrl-C to abort. と表示されます。 Enter を押して続行します。 途中で()めたくなったら いつでも Ctrl-C を押せば止められます。

続いて Which languages are you interested in? と表示されるので 必要なものを画面の指示にしたがって選択し、 Enter を押します。

インストールされているソフトウェアのチェックが終わると、Do you want this installer to download, compile and install Nginx for you? と、 インストール方法を聞かれます。 ソースからコンパイルを行うので 2. No: I want to customize my Nginx installation. (for advanced users) を選びます。

また、 私の場合は PCRE というのがインストールされていなかったようで、 途中で自動的にダウンロードされました。

次にソースファイルの場所とオプションの入力が必要になります。 次のように入力しました。

Where is your Nginx source code located?
/usr/local/src/nginx-1.8.0
nginx のソースの場所です。
Where do you want to install Nginx to?
デフォルトのまま何も入力せず Enter を押しました。
nginx のインストール先です。
Extra Nginx configure options
--add-module=/usr/local/src/headers-more-nginx-module-0.261
nginx をコンパイルする際のオプションです。 headers-more-nginx-module を使用するため、 --add-module オプションを設定しています。 デフォルトで設定されるオプションはコンソール上に表示されます。

最後の意志確認をされますので、 まちがっていなければ Enter を押します。 コンパイルとインストールが実行されます。

nginx の設定

私は /opt/nginx/conf/nginx.conf.default をコピーして /opt/nginx/conf/nginx.conf を作って編集しました。 (もっときれいなやり方もあると思いますが。)

Rails を動かすだけなら 次のようにすれば OK です。 抜粋してサンプルを掲載します。 client_max_body_size はクライアントからの画像アップロードのために設定しています。 (デフォルトでは1Mだそうです。) その他の設定値の意味は Phusion Passenger users guide, Nginx version などに説明がありますのでそちらをご参照ください。

そこにヘッダレスポンス変更のための記述を追加します。

設定が間違っていないことを次のコマンドでチェックします。 エラーが表示されなければ OK です。

Nginx の再起動 (または起動)

再起動のときには /opt/nginx/sbin/nginx -s reload とやることが多いのですが、 今回はそれではうまくいきませんでした。

/opt/nginx/sbin/nginx -s stop で nginx を止めてから /opt/nginx/sbin/nginx を実行するとうまくいきました。

初めて起動する場合は /opt/nginx/sbin/nginx のみ実行すれば OK です。


Rails 4 : TSV から seed データ を入れる


Rails で 先般 クライアント から 基本のデータを Excel で入れられるようにしてほしい という依頼がありました。 編集を行うデータだったら編集画面を作って DB で管理したほうがいいことを伝えましたが、 どうしても Excel がいいそうで。 Excel は必要以上に多機能で、すべてのデータをそのままデータベースに反映するのが難しそうであることから()めておいた方がいいと伝えて、 Excel との インポート・エクスポート が容易な TSV で対応することとなりました。 そのときの方法を書いておきます。

TSV は 内容をコピーしてそのまま表計算ソフトに貼り付けることもできますし、表計算ソフトから TSV に貼り付けることもできるので、 Excel でも扱いやすいです。 データが欠損することがあるので、その点で注意が必要です。

環境

  • Ubuntu 14.04 LTS
  • Rails 4.1.8
  • Ruby 2.2.2

方針

  1. TSV 取り込みの機能を task で作り、 rake コマンド で取りこめるようにする。
  2. rake db:seed を行ったときに、 TSV を読み込むタスクを実行するようにする。
続きを読む Rails 4 : TSV から seed データ を入れる

Rails シンプル ログローテーション


Rails でシンプルにログローテーションする方法です。

環境

  • Rails 4.1.8
  • Ruby 2.2.2
  • Ubuntu 15.04 (64bit)

設定

Rails の config/application.rb に次の記述を追加します。

ここでは 100 MB (104,857,600 バイト) で 最大 10 ファイル まで保存するようにしています。 要するに 1 GB までログを保存する。 また、 10 ファイル を超えると、古いものから削除されていきます。

Rails の標準では daily, weekly などのログの設定方法もありますが、その場合は古いログファイルは削除されません。

テスト方法

例えば development 環境 でテストする場合、 次のコマンドで 100 MB を超えるログファイルをあらかじめ作成しておく。

bsはブロックサイズ、countは書き込み回数を表しています。

そこで、 rails s のコマンドでサーバを起動して、 どこかのページにアクセスします。 すると、 development.log, development.log.0 ができているはずです。

Rails のロギングは、 SyslogLogger や Linux の logrotate を使う方法もあります。


Magnum CI で Rails をテストした方法


Magnum CI は 無料で使える CI 環境で、 きっと愛用している人も多いと思います。 本記事では、 Bitbucket で管理している Rails のコードを、 Magnum CI でテストした時のメモを書いておきます。

続きを読む Magnum CI で Rails をテストした方法