Home –  Rails
Tag Archives: Rails

Twitter Bootstrapとwill paginate使うとしょんぼり

http://www.slideshare.net/rosylilly/twitter-bootstrap-intro

↑のスライドを見ました。
「プログラマーはダサい。今やこれは常識!!」・・・・はい、マジでそう思います。すくなくても私はダサい!!!

ということで今作っているプログラムに導入してみました。twitter-bootstrap-railsというのを使って割りとちょちょいのちょいで入れることが出来ました。。。がそこにwill paginateが邪魔をしてくれました。

そう、表示が崩れてしますのです。

幸いなことに既に同じ状況で困っている方もおり、まとめておられました。

とりあえず、こちらのページをご案内(´・ω:;.:…
http://d.hatena.ne.jp/CortYuming/20120131/p1

残念な事にうちの環境では微妙に上手く表示されません。そこで出力するタグを修正することにしました。先程のページの設定(特にCSS)は入れたあとで下記のようなクラスを作成します。

twitter bootstrapでは<ul><li>を使ってページ番号を表現するようですのでそのようにしていきます。

class BootstrapPaginationRenderer < WillPaginate::ActionView::LinkRenderer   private      def previous_or_next_page(page, text, classname)       link(text, page, :class => classname)
  end

  public
  # method as you see fit.
  def to_html
    html = pagination.map do |item|
      tag(:li,
        ((item.is_a?(Fixnum))?
          page_number(item) :
          send(item)))
    end.join(@options[:link_separator])

    html = tag(:ul, html)

    @options[:container] ? html_container(html) : html
  end

end

このクラスを作ったのちにwill paginateを使う部分では例えばこんな感じに作ったクラスを使用するようにします。

<%= will_paginate @results, :renderer => BootstrapPaginationRenderer %>

私の環境ではこれで問題なく表示されるようになりました。

YahooのWebAPIを使おうと四苦八苦

ひょんなことから、漢字に致して振り仮名ふりたいなと思って探していたら、YahooのWebAPIの中にルビ振りのAPIがあるのを見つけました。

http://developer.yahoo.co.jp/webapi/jlp/furigana/v1/furigana.html

という事で、Railsでどうにかこうにか使おうと思いまして、色々調べたりしながらやってたわけですが・・・・。

単純にActiveResouce使って引っ張ってきてもなんかエラーが出てしまって・・・。
んで調べたら こちらの記事に行き着きまして・・・

http://cocomonrails.blogspot.com/2009/09/railswebapi-activeresourceyahooapi-3.html

Format  のクラスを作ってやるのか!と感激したと同時に奥が深いなぁと。
Railsは奥が深くて大変です(´;ω;`)

rails3とwill_paginateとAjaxなページヽ(´ー`)ノ

最近ようやくRails3を使い始めたり、そしたらいつの間にかRail3.1がリリースされたり。

Rails2.2、2.3時代は素通りなので何もかも新しい(;・∀・)
なので最近ここにメモ残しながらやっているのですが・・・・今回はwill_paginateでハマったという話を。

RailsでAjaxな更新と言えば、link_to :remote => trueでやるっぽいですが、私はそのへんはよくわからないのでとりあえずJQueryの $.ajax でやっていました。

Ajaxで取得したページがリスト化されていて、次ページ、前ページもAjaxな読み込みをしたいのですが、どうやらwill_paginateにそんな処理はないようです。

で色々検索したら色々と困って、対応をした人を発見。

後者のではRails3用のwill_paginateで一見よさそうなのですがurlメソッドでエラーになってしまうようです。
どうやら「WillPaginate::ViewHelpers::LinkRenderer」のクラスでメソッド定義されてないからみたいです。
色々調べたり試行錯誤したけっか、「WillPaginate::ActionView::LinkRenderer」を継承して作るのがよいのかなぁと。

それと、個人的にはlink_to :remote => trueなリンクでは個人的にはあんまり役に立たず、JavaScriptが呼び出せればいいなぁと。
なので、そういう感じに作って見ました。

class JavascriptLinkRenderer < WillPaginate::ActionView::LinkRenderer

private

 def link(text, target, attributes = {})
   if target.is_a? Fixnum
     attributes[:rel] = rel_value(target)
     func = @options[:params][:function]

     target = "#{func}(#{target})"
   end
   attributes[:href] = '#'
   attributes[:onclick] = target
   tag(:a, text, attributes)
 end
end

こんな感じでいいのかなぁ。。。(;・∀・)
と思いましたが(゚ε゚)キニシナイ!!

呼び出し側は例えば感じ

<%= will_paginate @results,
  :renderer => JavascriptLinkRenderer,
  :params => {:function => 'hogehoge'}
%>

そすると hogehoge([ページ番号]) なJavaScriptが作られるのです。
hogehogeなJavaScriptとかで $.ajax してページ読みこめばいいんじゃないかな(´・ω・`)?

とりあえずこんな感じにしのぎましたけど、情報が少なくて大変でした( ;∀;)
あと link_to :remote => true な使い方を覚えなければぁぁぁ。

Rails3で論理削除とかでアバババババ(;´Д`)

最近Rails3を勉強しています。

んで、よくある事と言えばやはりDBからの削除で論理削除をしたかったりとか更新ユーザーを保存したかったりとかするのです。

そこで出てくるのがRailsの各種プラグイン類。
論理削除で言えばrails3_acts_as_paranoid
更新ユーザーを保存するのであればmagic_userstampというのがあるようです。

ああ、更新ユーザー保存するならユーザー認証の仕組みも必要ですね。ということでauthlogicを組み合わせました。

・・・・が、論理削除を行った際ですが、どうしてもdeleter_idにユーザーのIDが保存されません(;´Д`)
magic_userstampのドキュメントをみるとacts_as_paranoidには対応しているようです。
・・・・・はっ!これはRails2時代のものじゃないか(;´Д`)

で試行錯誤しながら数時間かかりました。わかった事と言えば。

  • magic_userstampはact_as_paranoidの有無の判別にはCaboose::Acts::Paranoidの存在をチェックしているらしい。
  • Caboose::Acts::Paranoidを適当に定義してもdeleter_idに保存されない。どうやら rails3_acts_as_paranoidとacts_as_paranoid仕組みが違うっぽい。
  • rails3_acts_as_paranoidは最終的にはdeleted_allのメソッドを置き換えてupdate_allを発行しているみたいだ。
ということがなんとなくわかりまして・・・・初心者ながら思ったのは。
「delete_all」を上書きすればいいんじゃね!
ということです。
また試行錯誤しながらこんなの書いてみました。
module ParanoidOnDeleterId
 def self.included(klass)
   klass.send :extend, ClassMethods
   klass.instance_eval do
     alias :delete_all_without_explain :delete_all
     alias :delete_all :delete_with_explain
   end
 end

 module ClassMethods
   def delete_with_explain(conditions = nil)
     if User.stamper.is_a?(Numeric)
       update_all ["#{paranoid_configuration[:column]} = ?, deleter_id = ?", delete_now_value, User.stamper], conditions
     else
       delete_all_without_explain(conditions)
     end
   end
 end
end

まぁ、英語よーわからんので名前付けが変っぽいのは許してください(;´Д`)
で該当するモデルに

class Hage < ActiveRecord::Base
  acts_as_paranoid
  MagicUserstamp.config.compatibles
  include ParanoidOnDeleterId
end

こんなこんな感じにしてみたらちゃんとdeleter_idに入りましたとさ。

その場しのぎ感がすごいですがこれでいいやw