Ruby on Railsの最近のブログ記事

Railsコンソールを使ってコントローラのなかで色々試す

Railsのコントローラの中ではいろいろなヘルパーメソッドが使えますが、コードを書く際にRailsコンソールを起動してトライアンドエラーで試してみたいことがよくあります。

今まではrails serverを起動してソースコードに一時的にdebuggerやbinding.pryを記述することで停止させていたのですが、一時的でもソースコードにすぐ不要になるコードを書くのは気持ち悪いものですし、うっかりcommit、pushしてしまうとかなりしょんぼりです。

ソースコードを書き換えずにRailコンソールから止める方法を考えてみました。

Rails consoleからdebuggerを起動してブレークポイントを設定する

ここまでは簡単です。

$ bundle exec rails c
> debugger
(rdb:1) b HomeController.index
(rdb:1) c
>

最後にc(ontinue)コマンドでデバッガから抜けてconsoleに戻っています。

コントローラを呼ぶリクエストを実行する

続いて目的のコントローラを実行します。Railsコンソールにはappヘルパーがあって、直接リクエストを呼ぶことができます。HomeController#indexがrootにルーティングされているなら、getメソッドを使って

> app.get '/'
Breakpoint 1 at HomeController:index
/path/to/repository/app/controllers/home_controller.rb:8
def index
(rdb:1) 

これで、Controller内のconsoleで実験できるようになりました。

コントローラの中でコンソールを使ってみる

例えばクッキーを操作するcookiesヘルパーを試してみます。

(rdb:1) p cookies.signed[:hoge] = ['a','b','c']
["a", "b", "c"]
(rdb:1) p cookies[:hoge]
"BAhbCEkiBmEGOgZFVEkiBmIGOwBUSSIGYwY7AFQ=--3dd62e6bec43666604256e897ca65b925d4bb7f1"
(rdb:1) p cookies.signed[:hoge]
["a", "b", "c"]
(rdb:1) 

この方法ならステージング環境のRailsコンソールでもいろいろな確認ができそうです。

新しいRailsアプリを作りたくてRMagickをインストールしようとしたらImageMagickが見つからないと怒られた。

経験上これは使おうとしたRMagickのバージョン2.13.2に対してインストールされているImageMagickのバージョンが古い時になる。おそらく新しいImageMagickをHomebrewで入れてあげればうまくいくはず。

Install Specific Version of Tool With Home Brew にやり方が載っていました。

まずはHomebrewが認識しているパッケージを最新に更新します。

$ cd$(brew --prefix)
$ brew update

現在は6.7.7-6がインストールされているのですがはたして...

$ brew versions imagemagick
6.8.0-10 git checkout 45a4978 Library/Formula/imagemagick.rb
6.7.7-6 git checkout 834ce4a Library/Formula/imagemagick.rb
6.7.5-7 git checkout f965101 Library/Formula/imagemagick.rb
  :

より新しい6.8.0-10が登録されています。

先程のversionsでリストされた対象バージョンのgitコマンドを実行するとインストールできるようになります。

$ git checkout 45a4978 Library/Formula/imagemagick.rb
$ brew install imagemagick
Error: imagemagick-6.7.7-6 already installed
To install this version, first `brew unlink imagemagick'

あら?エラー。6.7.7-6があるのでインストール先からunlinkするように言われています。

$ brew unlink imagemagick
Unlinking /usr/local/Cellar/imagemagick/6.7.7-6... 65 links removed

再びインストール実行。

$ brew install imagemagick
==> Installing imagemagick dependency: freetype
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/freetype-2.4.11.mountain_lion.bottle
######################################################################## 100.0%
==> Pouring freetype-2.4.11.mountain_lion.bottle.tar.gz
   /usr/local/Cellar/freetype/2.4.11: 57 files, 2.5M
==> Installing imagemagick
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/imagemagick-6.8.0-10.mountainlion.bo
Already downloaded: /Library/Caches/Homebrew/imagemagick-6.8.0-10.mountainlion.bottle.tar.gz
==> Pouring imagemagick-6.8.0-10.mountainlion.bottle.tar.gz
   /usr/local/Cellar/imagemagick/6.8.0-10: 1422 files, 45M

無事インストールされました。確認してみます。

$ brew list imagemagick
/usr/local/Cellar/imagemagick/6.8.0-10/bin/Wand-config
/usr/local/Cellar/imagemagick/6.8.0-10/bin/stream
 :

さて、新しく作るアプリはこれでいいとして、既存のをメンテしたくなったらどうするの?という疑問が浮かびますね。そちらのRMagickもバージョンアップするというのも手ですが依存ライブラリの関係上難しいこともあるでしょう。

そんなときのためにHomebrewでインストールされているパッケージはバージョンを切り替えることができます。

$ brew switch imagemagick 6.7.7-6
Cleaning /usr/local/Cellar/imagemagick/6.7.7-6
Cleaning /usr/local/Cellar/imagemagick/6.8.0-10
65 links created for /usr/local/Cellar/imagemagick/6.7.7-6

これで、前のバージョンが使えるようになりました。戻すのも同様にbrew switch <package name> <version>ですよ。

Rails3.2のWebアプリケーションをhttpsアクセスで使用する場合、通常SSLアクセラレータまでをSSL通信し、そこから内部の通信はhttpで行うことが多い思います。

こういう経路です。

INTERNET
 ↓ https
SSL ACCELERATOR
 ↓ http
Nginx
 ↓ Passenger module
Rails App

RailsはHTTPで動いているため何もしないとredirect_toでリダイレクトした場合httpプロトコルでリダイレクトされてしまいHTTPSのみ許可している場合アクセス不能になります(-ω-)

RailsはX-Forwarded-ProtoというHeaderにhttpsがわたってくればSSLモードで動いてくれてhttpsのリダイレクトがされるのですがNginxでそれを設定する方法を検索してみると

proxy_set_header X-Forwarded-Proto https;

こればかり引っかかり、設定してみても一向に効かない...

良く考えてみるとPassengerはProxyでなくCGIじゃまいか!

ここで本家ドキュメントをよく読んでみると

Phusion Passenger users guide, Nginx version (5.5.3. passengersetcgi_param <CGI environment name> <value>) でHeaderを設定することができそうです。

ドキュメントをよく読んで

passenger_set_cgi_param HTTP_X_FORWARDED_PROTO https;

こう設定することによって、やっと思い通りの動きをしてくれました。ヽ(´ー`)ノ

ハマった〜(>ω<)

いつもググってばかりいたのですが一覧を出す方法をやっと知りました(-ω-)

rake -Tみたいなのですね。

Qiitaに書きました(・ω・)

link_to_if は第1オプションに真偽値を与えて、trueならそれ以降のオプションをlink_toにそのまま与えたリンクの表示を、falseならラベルのみを表示するヘルパーです。

しかし表示自体を消して空文字を出力したい場合もあります。

link_to_if はブロックを取ることができ、第1オプションがfalseの場合、ブロックが実行され結果が表示されます。

したがって、空ブロックを与える事によって目的が達成できますよ。

メンズカジュアルならSPUTNICKS スプートニクスがベスト!

サイドバーに表示するリンクはコンテンツビューの内容によって変わることが多いはずです。

Railsにはそういう時に使える仕組みがあらかじめ用意されているので簡単です。

新しいRailsプロジェクトを作ってサイドバー上に自由にリンクを設定する方法を説明していきます。

$ rails new sidebar-sample
$ cd sidebar-sample

レイアウトを自分で書くのもタルいのでBootstrap,from Twitterを使いましょう。

Gemfileに1行追加してbundleを実行します。

$ vi Gemfile
#↓これを追加
gem "twitter-bootstrap-rails"
$ bundle
$ rails g bootstrap:install
$ rails g bootstrap:layout application fluid
    conflict  app/views/layouts/application.html.erb
Overwrite /Users/iwazawa/tmp/sidebar-sample/app/views/layouts/application.html.erb? (enter "h" for help) [Ynaqdh] Y
       force  app/views/layouts/application.html.erb
$ rails g scaffold Book name:string asin:string author:string price:float
$ bundle exec rake db:migrate
$ rm public/index.html
$ vi config/routes.rb
  #↓これを追加
  root :to => 'books#index'
$ rails s
$ open http://localhost:3000/

ここまでで、こういうレイアウトでページが表示されるはずです。

20120311_01.png

まずはレイアウトファイルapp/view/layouts/application.html.erbを開いてサイドバー部分をそれぞれのビューから置き換えられるようにします。

具体的にはul.nav-list内の既存の行をカットして<%= yeld :sidebar %>に置き換えるだけです。

$ vi app/view/layouts/application.html.erb

続いてそれぞれのビューを編集します。まずはapp/view/layouts/books/index.html.erbから。

先頭にsidebarに挿入するためのコードを追加します。Rails Helperのcontent_forを使って、エイアウトファイルに書いたyeildの名前(シンボル)を指定し、ブロック内にリンクコードを列挙するだけです。

$ vi app/view/books/index.html.erb

せっかくBootstrap,from Twitterを使っているのでコンテンツ内の機能リンクはボタンっぽいUIに変更しちゃいましょう。

link_toヘルパーに:classHTML属性を追加します。CSSでbtn btn-primaryと指定することによってメインのボタンの見栄えに変わります。

ここまでで、books/indexページがこういうふうに表示されるようになりました。

20120311_02.png

app/view/layouts/books/の残りのビューも同様に変更します。

20120311_03.png

全部のメニューが同じようなのでは、気分が出ないのでapp/view/books/show.html.erbにはDB項目に入っているASINを使ってAmazonに飛ばすリンクを追加しましょう。

20120311_04.png

テーブルはBootstrap,from Twitterのスタイルを当てると非常に見栄えが良くなりますので、ちょいちょいと指定します。

ポイントはERBのコメントにも書いてあるとおり下記スタイルの適用です。

  • table.table
  • td.span<N>
  • a.btn-mini

一覧も綺麗になってちゃんとした(?)アプリっぽくなりました!

20120311_06.png
※↑クリックすると大きな画像が表示されます

Railsって知らないとハマるけど、知ってると非常に楽なフレームワークですよね。

HerokuでRails3アプリケーションを作成するさいストレージにMongoDBを、ORMにMongoMapperを使用する場合の手順です。 #他にも方法があるかも知れませんが...

まだ、やってなかったらherokuモジュールを入れたり、Railsを入れたりアップデートしたりしときます。

$ gem install heroku
$ gem update rails

アプリケーションを生成します。MongoMapperを使うのでデフォルトのactive-recordを切っときます。

$ rails new test-app --skip-active-record
$ cd test-app
$ git init
$ git add .
$ git commit -m 'Initial commit.'

必要なモジュールを追加しましょう。

$ vi Gemfile

gem "mongo_mapper", '>=0.8.2'
gem "bson_ext"
gem "rails3-generators"
gem "rspec-rails"

$ bundle install

GeneratorにMongoMapperの設定を追加してもらいます。

$ script/rails g mongo_mapper:install test-app-db

ローカルではデフォルトのlocalhost:27017を使うとするとconfig/database.mongo.ymlは何も変える必要はありません。

接続できているか確認しましょう。

$ rails console
Loading development environment (Rails 3.1.3)
ruby-1.9.2-p290 :001 > class Hoge
ruby-1.9.2-p290 :002?>   include MongoMapper::Document
ruby-1.9.2-p290 :003?>   key :name, String
ruby-1.9.2-p290 :004?>   end
 => # 
ruby-1.9.2-p290 :005 > Hoge.create!(:name => 'Nanashi San')
 => # 
ruby-1.9.2-p290 :006 > 

mongoに直接つないでも確認してみます。

$ mongo
MongoDB shell version: 1.6.5
connecting to: test
> show dbs
test-app-db_development
> use test-app-db_development
switched to db test-app-db_development
> db.getCollectionNames()
[ "hoges", "system.indexes" ]
> db.hoges.find()    
{ "_id" : ObjectId("4ee6f1f15ce68e3de8000001"), "name" : "Nanashi San" }
> 

ローカルの接続設定ができたので、一度コミットしておきます。

$ git add .
$ git st
$ git commit -m 'local mongo setting'

次は、いよいよHeroku上でもMongoLabに繋がるようにしたいと思います。

$ heroku create
Creating warm-sunrise-3496...
 done, stack is bamboo-mri-1.9.2
http://warm-sunrise-3496.heroku.com/ | git@heroku.com:warm-sunrise-3496.git
Git remote heroku added

warm-sunrise-3496 という名前でHeroku上にアプリケーションができました。

MongoLab Add-onをアプリケーションに追加します。

$ heroku addons:add mongolab:starter
-----> Adding mongolab:starter to warm-sunrise-3496... done, (free)
       Welcome to MongoLab.

(MongoLabを使用するにはFree版を使う場合でもクレジットカードなどで課金情報を有効にしておく必要があります)

Herokuで作成したアプリケーションの設定ページを表示します。

https://api.heroku.com/myapps/warm-sunrise-3496

右上にAdd-onsというメニューがあるので、MongoLabを選択します。

Usersタブを表示して、Addボタンをクリックしアプリケーションが接続するためのユーザを登録します。

また、タブの上部に

mongodb://:@ds000000.mongolab.com:11111/heroku_app2222222

このような接続URI情報が表示されているのを確認し、config/database.mongo.yml のproductionモードにHerokuの設定を追加します。 usernameとpasswordは先ほどUserタブで追加したものです。

$ vi config/database.mongo.yml
 :
production:
  <<: *defaults
  host: ds000000.mongolab.com
  port:11111
  username: hogehoge
  password: password
  database: heroku_app2222222
 :

あと、もう一点。このままではポートの変更が効かないようで、初期化ファイルを少しだけ変更します。

$ vi config/initializers/mongo_mapper.rb

-  MongoMapper.connection = Mongo::Connection.new(mongo['host'])
  ↓
+  MongoMapper.connection = Mongo::Connection.new(mongo['host'], mongo['port'])

いよいよHerokuに送ります。

$ git add .
$ git commit
$ git push heroku master

動いたかな?

http://warm-sunrise-3496.heroku.com/

大丈夫そうです(`・ω・´)

昨日、mongrelの事を書いたばかりですが、Ruby1.9.2、Rails3じゃmongrel_clusterが全然動かない(>ω<)

みんなどうしてるんだろうなと、ネットを徘徊してみると時代はthinなんですね!

nginx+thin

いや〜、導入も簡単で動きも、varnish+mongrel_clusterより速い気がしますな〜

今読ミもRails3化したらnginx+thinに移行しよう(`・ω・´)

新しい環境にmongrelをインストールしようとして毎回ググってる事に気付き、備忘のため。


ちなみに --pre 付けないと、こんなエラー吐きます。
INFO:  `gem install -y` is now default and will be removed
INFO:  use --ignore-dependencies to install only the gems you list
Building native extensions.  This could take a while...
ERROR:  Error installing mongrel_cluster:
	ERROR: Failed to build gem native extension.

        /Users/iwazawa/opt/ruby-1.9.2-p290/bin/ruby extconf.rb
checking for main() in -lc... yes
creating Makefile

make
gcc -I. -I/Users/iwazawa/opt/ruby-1.9.2-p290/include/ruby-1.9.1/x86_64-linux -I/Users/iwazawa/opt/ruby-1.9.2-p290/include/ruby-1.9.1/ruby/backward -I/Users/iwazawa/opt/ruby-1.9.2-p290/include/ruby-1.9.1 -I.   -fPIC -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long  -o http11.o -c http11.c
http11.c: In function 'http_field':
http11.c:77: error: 'struct RString' has no member named 'ptr'
http11.c:77: error: 'struct RString' has no member named 'len'
http11.c:77: 警告: カンマ演算子の左側の式に効力がありません
http11.c: In function 'header_done':
http11.c:172: error: 'struct RString' has no member named 'ptr'
http11.c:172: error: 'struct RString' has no member named 'ptr'
http11.c:172: error: 'struct RString' has no member named 'ptr'
http11.c:174: error: 'struct RString' has no member named 'ptr'
http11.c:176: error: 'struct RString' has no member named 'ptr'
http11.c:177: error: 'struct RString' has no member named 'len'
http11.c: In function 'HttpParser_execute':
http11.c:298: error: 'struct RString' has no member named 'ptr'
http11.c:299: error: 'struct RString' has no member named 'len'
make: *** [http11.o] エラー 1


Gem files will remain installed in /Users/iwazawa/opt/ruby-1.9.2-p290/lib/ruby/gems/1.9.1/gems/mongrel-1.1.5 for inspection.
Results logged to /Users/iwazawa/opt/ruby-1.9.2-p290/lib/ruby/gems/1.9.1/gems/mongrel-1.1.5/ext/http11/gem_make.out
を書こうかなと思って、今読ミ2008年に読み終わった本をチェックしてたんですが、不便です(>ω<)
ベストを書こうと思ったら評価での並べ替えが出来ないと探せない。それほど読むのが速いとは言えない私でも、今日までで132冊(もう一冊増えそうだけど)、今読ミの表示で14ページ分もある。自力で確認するのはばかばかしいですよね。コンピュータにやらせよう。

とりあえずUIを考えているとそれだけで年が明ける(ぼくは向いていない...)ので、URLだけ考えて年内はしのぐ方向で(笑)
年指定で読み終わった本の一覧のURLは
http://imayomi.jp/archives/iwazer/2008
なので、評価の逆順(評価が高い方が先に表示)のパラメータをこんな感じで追加することにしよう。
http://imayomi.jp/archives/iwazer/2008?order=evaluation_desc
評価は内部的にevaluationという名前なので、その逆順(SQLのORDER BY evaluation DESCという意味で) paginateプラグインやその他いくつかのリンクに渡すパラメータが増えたり、その辺りの動作確認に少し手間取ったけど、一応できた

さて、本題の2008年に読んだ本ベストhogeは、次のエントリーということで、一休み(笑)

music: A Change of Seasons -- Dream Theater

このアーカイブについて

このページには、過去に書かれたブログ記事のうちRuby on Railsカテゴリに属しているものが含まれています。

前のカテゴリはRubyです。

次のカテゴリはRubyMotionです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。