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

ピクチャ 1.png

ダウンロード&使い方については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

ピクチャ 2.png
個人的によく使うのは、ビューとコントローラの切り替えと、ログ表示機能、ファイル表示機能などでしょうか。なお、個人的によくやる

return render(:action => :index)

のような記述の場合にC-Enterを押すと、”index)”までの認識になってしまいます。

render :action => :index
return

の場合は問題ありません。Java開発を通じてEclipseの素晴らしさに触れている方はRadRailsを使われるケースも多いようですが、個人的には重たいように感じられてなりません。Emacsがごく軽いかと言われるとそうでもありませんが…。

Rails2.0からページネーションがプラグインベースになりました。普通のページネーションであれば、

@memos = @user.memos.paginate(:page => params[:page], :per_page => 10, :o 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 :o 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, :o 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件になってしまうようですね。これはなぜなんだろう…。

MOONGIFTネットワーク。こちらもぜひご覧ください。
MOONGIFT

Warning: array_slice() [function.array-slice]: The first argument should be an array in /virtual/producing/public_html/producing-web.com/wp-content/themes/network.php on line 15
  • No items
Open Service
Rails 2.0
Resident on Net
iPhone最適化
リーンソフトウェア
MarketPedia
Producing Web
Cool Coding