koukiblog

たぶんweb系の話題

メソッドの名前を聞く

メソッドの名前忘れたときに、そのオブジェクトに聞いてしまうのが手っ取り早いのに気づいた。
Railsが用意してくれるとかメソッド覚えてられない。。

例えば、数値を変換してくれるメソッドを探す時は

  1.methods.grep /to_./
  #=> [:to_s, :to_f, :to_i, :to_int, :to_r, :to_c, :respond_to_missing?, :to_enum]

みたいに、配列で返してくれる。

methods は、特異クラスのメソッドも全て返却してくれて、
methods(false)を渡すと、特異クラスのメソッドは省いて返却される

他にも色々あるけど(http://ref.xaio.jp/wikis/2/entries/search?q=methods)、ぱっと調べるには、methodsをgrepが楽

Railsのutf8パラメータとcommitパラメータ

Railsで検索フォームみたいなのを作るとき、RailsGuide通りにすると

<%= form_tag("/search", :method => "get") do %>

  <%= label_tag(:q, "Search for:") %>

  <%= text_field_tag(:q) %>

  <%= submit_tag("Search") %> 

<% end %>

↑みたいなコードになり、フォームから遷移するURLに
「/search?utf8=✓&q=&commit=Search」
のようにutf8パラメータとcommitパラメータがつきます。
まぁ別に困らないのだけど、よくわらないパラメータがURLに追加されるのはいまいち。。
ちょっと気になったので、それぞれ調べてみました。

・utf8パラメータ
出力自体は、↓のutf8_enforcer_tagで行われています。
https://github.com/rails/rails/blob/3-2-stable/actionpack/lib/action_view/helpers/form_tag_helper.rb#L607

helperでoverrideしろと書いてあるので、気になる場合は、overrideすればよいようです。
ただし、戻り値をなくしてしまうと、このメソッドの戻り値に対してさらにタグを追加するのでエラーが発生してしまいます。
空文字を返しておけばok。

もうちょっと調べてみると、このパラメータは、古いIE対策にセットされたものようです。
http://stackoverflow.com/questions/4104474/rails-3-utf-8-query-string-showing-up-in-url
IE5以前は、accept_charsetが無視されてしまうとかなんとか。
submitするときに、パラメータに強制的にunicode文字を含めることで対応しています。
元々は雪だるまだったのだけど、現状のRailsではチェックマークになったみたいですね。

・commitパラメータ
どのボタンが押さたのか、サーバ側で判断できるように、デフォルトでついているようです。
(params[:commit] みたいな感じで)
submit_tagから出力されるHTMLがデフォルトで下記のようになっているので、commitパラメータが付加されます。

<input name="commit" type="submit" value="Save changes">

ソースは、↓のようになっているので
https://github.com/rails/rails/blob/3-2-stable/actionpack/lib/action_view/helpers/form_tag_helper.rb#L428

submit_tag のoptionとして :name=nil を渡せばok

  <%= submit_tag "Search", :name => nil %>

とすれば、inputタグのname属性が出力されなくなります。

rbenvに乗り換えてrailsにパスが通らずはまった

macportアンインストールして、homebrewインストールして、rbenvでrubyインストールした。
その辺りはたくさん情報あったのだけど、そのあとではまった。

gem install rails

してもrailsにパスが通らない

.rbenv/shims/rails

がなぜか存在しない。。
結局

gem install railties
rbenv rehash

で解決した。

railsコマンドはrailsには存在してないからとかそういう感じらしい。

capistranoのメモ

capistranoをなんとなく使っていたのだけど、
今日はじめて複数環境にデプロイできるようにしたので、メモ。

複数環境にデプロイ

既にスクリプトが存在している前提ですが、

# 共通の設定は外にかけばよい
set :deploy_to, "/var/www/html/#{application}"

task :staging do
  set :user, "XXXXXXX"
  role :web, "XXXXXXX"
  role :app, "XXXXXX"
  # などステージング環境用の設定
end

task :production do
  set :user, "XXXXXXX"
  role :web, "XXXXXXX"
  role :app, "XXXXXXX"
  # などプロダクション環境用の設定
end

てすると、

 cap staging deploy

でステージング

 cap production deploy

でプロダクション環境用の設定を使ってデプロイされます。

runコマンド内でsudo

普通に"sudo XXXX"てやると対話的に聞かれなくて、詰まってたのですが、こうすればよかったらしい。

    run "#{sudo :as => 'root'} chown -R apache.apache #{current_release}" 

CodeIgniter調べてみた

いい感じらしいという話を聞いたCodeIgniterを調べてみた。

のだけど、ライセンスで炎上中なのですね。。(http://codeigniter.jp/blog/article/64

触ってみた感じは、すごくゆるいMVCフレームワークという感じ?

controllerとviewとmodelの仕組みは提供されていて、

/"コントローラ"/"メソッド"/引数/

みたいなURIでアクセスできて、コントローラ内で

$this->load->view("viewのファイル名")

とすれば、viewが表示される。

modelはあるけど使用は任意(!)で、db接続用の標準ライブラリが用意されている。

<?php
// modelを読んでもいいし
$this->load->model("モデル名");

// DBに接続してもよい

$this->load->database();
?>


最近仕事でPHPに関わり始めたのですが、素のPHPで書きたがる人てやっぱいるので(謎の自前ライブラリを多数所持してたりする)
そういう人にはCodeIgniter受けるかも。後から見る人もオレオレフレームワークよりは可読性高そう。
でも、なんかライセンスでもめてるのはマイナスですね。。残念。