Railsの開発向けエディタ(Emacs編)
Railsの開発に限った訳ではないのですが、筆者はテキストエディタはEmacsを使っています。なので、Railsの開発もEmacsで行っています。EmacsにはRails開発向けにrails.elが作られており、それを使うと効率的な開発ができるようになります。

ダウンロード&使い方についてはrails.el まとめ – ひげぽん OSとか作っちゃうかMona- を参考にしていただくとして、コマンドだけでも以下のように各種揃っています。
rails-browse-api rails-browse-api-at-point rails-controller-layout:menu rails-controller-layout:switch-to-controller rails-controller-layout:switch-to-functional-test rails-controller-layout:switch-to-helper rails-controller-layout:switch-to-migration rails-controller-layout:switch-to-model rails-controller-layout:switch-to-unit-test rails-controller-layout:toggle-action-view rails-controller-minor-mode rails-create-tags rails-find:config rails-find:controller rails-find:db rails-find:fixtures rails-find:helpers rails-find:javascripts rails-find:layout rails-find:lib rails-find:migrate rails-find:models rails-find:public rails-find:stylesheets rails-find:tasks rails-find:view rails-functional-test-minor-mode rails-goto-file-on-current-line rails-lib:run-primary-switch rails-lib:run-secondary-switch rails-log:open rails-log:open-development rails-log:open-production rails-log:open-test rails-migration-minor-mode rails-minor-mode rails-model-layout:menu rails-model-layout:switch-to-controller rails-model-layout:switch-to-fixture rails-model-layout:switch-to-mailer rails-model-layout:switch-to-migration rails-model-layout:switch-to-model rails-model-layout:switch-to-unit-test rails-model-minor-mode rails-nav:goto-controllers rails-nav:goto-fixtures rails-nav:goto-functional-tests rails-nav:goto-helpers rails-nav:goto-javascripts rails-nav:goto-layouts rails-nav:goto-mailers rails-nav:goto-migrate rails-nav:goto-models rails-nav:goto-observers rails-nav:goto-plugins rails-nav:goto-stylesheets rails-nav:goto-unit-tests rails-plugin-minor-mode rails-plugin-minor-mode:switch-to-init rails-plugin-minor-mode:switch-with-menu rails-rake:migrate rails-rake:migrate-to-prev-version rails-rake:migrate-to-version rails-rake:task rails-run-sql rails-script:breakpointer rails-script:console rails-script:create-project rails-script:destroy rails-script:destroy-controller rails-script:destroy-mailer rails-script:destroy-migration rails-script:destroy-model rails-script:destroy-observer rails-script:destroy-plugin rails-script:destroy-resource rails-script:destroy-scaffold rails-script:generate rails-script:generate-controller rails-script:generate-mailer rails-script:generate-migration rails-script:generate-model rails-script:generate-observer rails-script:generate-plugin rails-script:generate-resource rails-script:generate-scaffold rails-script:output-mode rails-script:toggle-output-window rails-search-doc rails-speedbar:get-focus rails-svn-status-into-root rails-test:compilation-mode rails-test:run rails-test:run-current rails-test:run-current-method rails-view-minor-mode rails-view-minor-mode:create-helper-from-block rails-view-minor-mode:create-partial-from-selection rails-ws:auto-open-browser rails-ws:open-browser rails-ws:open-browser-on-controller rails-ws:print-status rails-ws:start rails-ws:start-default rails-ws:start-development rails-ws:start-production rails-ws:start-test rails-ws:stop rails-ws:switch-default-server-type rails-ws:toggle-start-stop

個人的によく使うのは、ビューとコントローラの切り替えと、ログ表示機能、ファイル表示機能などでしょうか。なお、個人的によくやる
return render(:action => :index)
のような記述の場合にC-Enterを押すと、”index)”までの認識になってしまいます。
render :action => :index
return
の場合は問題ありません。Java開発を通じてEclipseの素晴らしさに触れている方はRadRailsを使われるケースも多いようですが、個人的には重たいように感じられてなりません。Emacsがごく軽いかと言われるとそうでもありませんが…。
will_paginate + acts_as_searchableで全文検索+ページネーション
Rails2.0からページネーションがプラグインベースになりました。普通のページネーションであれば、
@memos = @user.memos.paginate(:page => params[:page], :per_page => 10,
rder=>”memos.id DESC”)
だけで使えるようになって便利ですが、任意の情報に対してページネーションする方法がいまいち分かっていませんでした。そして、acts_as_searchableを使って、HyperEstraierで全文検索を行う際に、ページネーションをどのように行えば良いのか調べつつ分かったところを書いてみたいと思います。
実際にページネーション処理を行っているのは、
vendor/plugins/will_paginate/lib/will_paginate/finder.rb
になります。ここの
def paginate_by_sql(sql, options)
WillPaginate::Collection.create(*wp_parse_options!(options)) do |pager|
query = sanitize_sql(sql)
options.update
ffset => pager.offset, :limit => pager.per_page
original_query = query.dup
add_limit! query, options
# perfom the find
pager.replace find_by_sql(query)
unless pager.total_entries
count_query = original_query.sub /bORDERs+BYs+[w`,s]+$/mi, ''
count_query = "SELECT COUNT(*) FROM (#{count_query}) AS count_table"
# perform the count query
pager.total_entries = count_by_sql(count_query)
end
end
end
が参考になります。
pager.replaceに、リストを入れて、pager.total_entriesに行数を入れればOKのようです。この処理をまねて、
app/controllers/application.rb
に次のように定義します。
module WillPaginate
module Finder
module ClassMethods
def paginate_by_fulltext_search(query, options)
WillPaginate::Collection.create(*wp_parse_options!(options)) do |pager|
pager.replace fulltext_search(query, options)
count_options = Hash.new
count_options[:count] = true
count_options[:attributes] = options[:attributes] if options[:attributes]
pager.total_entries = fulltext_search(query, count_options)
end
end
end
end
end
です。そして、呼び出し側では次のようにします。
@memos = Memo.paginate_by_fulltext_search(params[:q], :attributes => “user_id NUMEQ %d” % @user.id, :limit => perpage,
ffset => offset, :page => params[:page], :per_page => perpage)
ここで、:limitはacts_as_searchable用、:per_pageはwill_paginate用になります。:pageや:offsetは共通で利用できるようです。:attributesはあれば設定します。これさえ設定しておけば、ビュー側は
<%= will_paginate @memos, :prev_label=> _(’« Prev’), :next_label=> _(’Next »’) %>
が利用できて便利です。ちなみにpaginate_by_sqlではoptionsがアップデートされるので、デフォルトの30件になってしまうようですね。これはなぜなんだろう…。