2011/05/30

link_toにブロックを渡す件の続き

昨日の続き。

link_toにブロックを渡すときのaタグ属性値は

こんな感じ。

<%= link_to(url, :target => '_blank') { 〜リンクを貼る文字列とか画像とか〜 } %>

ふむふむふむ

それにしても

SetucoCMSでZendFramework使うときにも思ったんだけど、
こんなにビューヘルパーたくさんあって、
HTMLコーダーのみなさんは問題なくビューを編集できるのかしら???
分業できなくないですかね。

Rails3のlink_toヘルパーで、画像と文字列にリンクを貼る

やりたいこと

<a href="リンク先URL">
<span>文字列</span>
<img src="画像パス" alt="あうあう">
</a>   

普通(?)にlink_toでやると

<%= link_to リンク文字列, リンク先情報 %>
こう?でもこれだと出力は
<a href="リンク先URL">リンク文字列</a>                       
になっちゃう。

これだとタグがエスケープされちゃう

<%= link_to("文字列", リンク先URL) %>
し、imgタグもなんか入れにくい

それlink_toのブロック構文でできるよ

<% link_to "リンク先情報" do %>                                                                                              
  <span>文字列</span> 
  <%= image_tag("画像パス", :alt => 'ほげほげ' %>
<% end %>
出力
<a href="リンク先URL">
  <span>文字列</span>
  <img src="画像パス" alt="ほげほげ">
</a>
できたわーい!

※上記の例だと最初からそのままaタグ書けばいいじゃんって思えるけど
 "リンク先情報"の部分で
 「:controller => 'hoge', :action => 'fuga'」
 とか指定したいのでlink_toを使ってます。image_tagも似たような感じ。

2011/05/28

will_paginateを拡張しようとしたら"uninitialized constant WillPaginate::LinkRenderer"エラー

will_paginateの表示をカスタマイズしたい

will_paginateのページネータで、デフォルトのspanタグではなく
ul>liを使いたかったので、renderer拡張クラスをつくろうとしてみた!

環境

railsのバージョンは3.0.7、will_paginateは3.0.pre2。

継承するクラスがない

ネット上でぐぐってみると

class CustomRenderer < WillPaginate::LinkRenderer   
   ・・・ここで拡張・・・ 
end 

っていう情報がよく見つかるけど、こうしようとすると

uninitialized constant WillPaginate::LinkRenderer

エラーが出ました。あうあう

will_paginateのクラス構造が変わってた(ViewHelpers)

rubyonrails-talkのMLでのやりとりを見ると、

class CustomRenderer < WillPaginate::ViewHelpers::LinkRenderer
   ・・・ここで拡張・・・ 
end 

って感じで、"ViewHelpers"が追加になったみたい!できた!

併せてwill_paginateのデフォルト設定

カスタムrendererを記述する場所はみんなそれぞれの場所に書いてるみたい。
(environment.rbとかapplication.rbとかapp/modelの下とか)
僕はこうしました。

app/helpers/paginate_helper.rb にヘルパーと拡張クラスを追加

# -*- coding: utf-8 -*-                          
module PaginateHelper                          
                                               
  def paginate collection, opts = {}           
    opts[:id] ||= 'pageNav'            
    opts[:previous_label] ||= '前へ'  
    opts[:next_label] ||= '次へ'               
    opts[:class] ||= nil                       
    opts[:renderer] ||= 'PaginateHelper::SetucoPaginateRenderer'
    will_paginate collection, opts             
  end                                          
                                               
  class SetucoPaginateRenderer < WillPaginate::ViewHelpers::LinkRenderer
    〜ここで拡張〜
  end                                          
                                               
end     

ビューで使うとき

<%= paginate @pages %>

すっきり!!

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | cna certification