2011/06/02

きめた ひっこそう

学校卒業と同時にブログタイトル変えるとき、
気分転換的にはてなからBloggerに移ってきたけど
どーもやっぱりなじまないからはてなにしよー。

http://d.hatena.ne.jp/akitsukada

ActiveRecordで木構造を扱うめも

1:nの自己参照 = 木構造のデータをRailsで扱いたい

具体的には、SetucoCMSのCategoriesテーブル。ERDは↓こんなの
https://spreadsheets.google.com/spreadsheet/pub?hl=ja&hl=ja&key=0AsZ5eShbQ7T_dDJRRm5pdkJUUDlHQUVobnhPckFnWWc&output=html

外部キーの名前も、デフォルトの
_idじゃなくてparent_idにしたい。

migrationの定義

こうした。

  1 class CreateCategories < ActiveRecord::Migration
  2   def self.up     
  3     create_table :categories do |t|
  4       t.string :name, :null => false
  5       t.integer :parent_id
  6       t.timestamps                                                                                                      
  7     end           
  8   end             
  9                   
 10   def self.down   
 11     drop_table :categories
 12   end             
 13 end  

Categoryモデルの定義


こうした。

  1 # -*- coding:UTF-8 -*-                                   
  2 class Category < ActiveRecord::Base                      
  3   has_many :pages                                        
  4                                                          
  5   has_many :children, :class_name => 'Category', :foreign_key => :parent_id                                             
  6   belongs_to :parent, :class_name => 'Category', :foreign_key => :parent_id
  7                                                          
  8 end    

試す(`・ω・´)

~/programming/ruby/SetucoCMSR$ rails c
Loading development environment (Rails 3.0.7)
ruby-1.9.2-p180 :001 > Category.all
 => [] 
ruby-1.9.2-p180 :002 > c = Category.create([
ruby-1.9.2-p180 :003 >       {:name => 'cat1'},
ruby-1.9.2-p180 :004 >       {:name => 'cat2', :parent_id => 1},
ruby-1.9.2-p180 :005 >       {:name => 'cat3', :parent_id => 1},
ruby-1.9.2-p180 :006 >       {:name => 'cat4', :parent_id => 2}
ruby-1.9.2-p180 :007?>     ])
 => (snip)
ruby-1.9.2-p180 :008 > pp c
[#<Category id: 1, name: "cat1", parent_id: nil, created_at: "2011-06-02 10:56:44", updated_at: "2011-06-02 10:56:44">,
 #<Category id: 2, name: "cat2", parent_id: 1, created_at: "2011-06-02 10:56:44", updated_at: "2011-06-02 10:56:44">,
 #<Category id: 3, name: "cat3", parent_id: 1, created_at: "2011-06-02 10:56:44", updated_at: "2011-06-02 10:56:44">,
 #<Category id: 4, name: "cat4", parent_id: 2, created_at: "2011-06-02 10:56:44", updated_at: "2011-06-02 10:56:44">]
 => (snip)
ruby-1.9.2-p180 :009 > pp c[0].children
[#<Category id: 2, name: "cat2", parent_id: 1, created_at: "2011-06-02 10:56:44", updated_at: "2011-06-02 10:56:44">,
 #<Category id: 3, name: "cat3", parent_id: 1, created_at: "2011-06-02 10:56:44", updated_at: "2011-06-02 10:56:44">]
 => (snip)
ruby-1.9.2-p180 :010 > pp c[1].parent
#<Category id: 1, name: "cat1", parent_id: nil, created_at: "2011-06-02 10:56:44", updated_at: "2011-06-02 10:56:44">
 => (snip)
ruby-1.9.2-p180 :011 > pp c[1].children
[#<Category id: 4, name: "cat4", parent_id: 2, created_at: "2011-06-02 10:56:44", updated_at: "2011-06-02 10:56:44">]
 => (snip)

でけた!

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