2010年06月16日

Ruby on Rails クラス変数 インスタンス変数 疑似変数

クラス変数とは?


参照可能範囲がクラス内です。

インスタンス変数とは?


参照可能範囲がメソッド内です。

疑似変数とは?


基本真偽を示すものかな。

クラス変数


これは特に書く事ないですね。
@@hoge = "hoge"
puts @@hoge
=> "hoge"

変数の頭に@@を付ければクラス変数です。
これもグローバル変数と同様参照範囲が大きいので、
使用する場合は注意我必要です。

インスタンス変数


普通の変数とこのインスタンス変数が最もよくつかいますね。
$ vi hoge_controller.rb
def hoge
 @hoge = "hoge"
end

$ vi hoge.rthml
<%= puts @hoge %>
=> "hoge"

メソッドで定義してビューで呼び出す場合、@ですね。

疑似変数


疑似変数の種類は少ないので、全て紹介します。
__FILE__:現在実行されているプログラムのファイル名
irb
__FILE__
=> "(irb)"

__LINE__:現在実行されているプログラムのファイル内の行数
irb
__LINE__
=> 1
__LINE__
=> 2

false:偽を表す
nil:参照先がない、偽を表す
self:インスタンス自体への参照
irb
class User
puts self
end
=> User

true:真を表す
posted by RicK at 14:48| Comment(2) | TrackBack(0) | 日記

2010年06月15日

Ruby on Rails グローバル変数と変数

グローバル変数とは?


同じプログラム内ならばどこでも参照可能

定数とは?


文字の通り定められた数、固定文字ですね。

環境


rails1.2.6
app/models/hoge.rb
app/controllers/hoge_controller.rb

使用方法


$ vi どこでもいいです
$hoge = "hoge"

$ vi ちがうどこか
puts $hoge
=> "hoge"

まぁ、グローバル変数に入れたものはどこでも参照可能ということですね。
一点注意が必要なのですが、$がついているものが全てグローバル変数ではありません。
例えば
$&

こんなんがあります。
これは正規表現でマッチしたものを取り出してくれます。
というわけでグローバル変数ではありません。

定数


$ vi hoge.rb
HOGE = "hoge"

$ vi hoge_controller.rb
puts Hoge::HOGE
=> "hoge"

自分はいつも定数は全部大文字で書いちゃいますけど、
基本的にHogeってかくものっぽいなぁ。
まぁ大文字で始まればいいからどっちでもいいのかな。
さて、この定数にも注意点があります。
定数に対して再定義は禁止です。
さらにこれにも注意点が有りまして、入れ替えは可能です。
$ vi hoge_controller.rb
Hoge::HOGE = "HOGE"
=> Error

Hoge::HOGE.sub!("hoge","HOGE")
=> "HOGE"

Hoge::HOGE = Hoge::HOGE.sub!("hoge", "HOGE")
=> 警告と"HOGE"

簡単に定数といってもなにげにしらないことが多いもんですよね。
posted by RicK at 15:35| Comment(0) | TrackBack(0) | 日記

2010年06月11日

Ruby on Rails ローカル変数

ローカル変数とは?


アルファベットの小文字か_から始まる変数のことです。

環境


rials1.2.6
app/views/hoge/hoge.rhtml
app/controllers/hoge_controller.rb

ローカル変数


$ vi hoge.rhtml
%lt;% hoge = "HHH" %>
 <%= hoge %>
=> "HHH"

<% 2.times do >
 <%= hoge %>
<% end %>
=> "HHH" "HHH"

<% 2.times do >
 <%= boge = 1 %>
<% end %>
%lt;%= boge %>
=> エラー発生

$ vi hoge_controller.rb
def hoge
 hoge = "HHH"
end
puts hoge
=%gt; エラー発生

hoge = "HHH"
def hoge
 puts hoge
end
=%gt; エラー発生


解説


ローカル変数は局地的で限定的な場所でしか参照できません。
ブロック内で作成した変数を呼び出す事はできません。
メソッドの外の変数は呼び出せませんし
メソッド内で作成した変数はそのメソッド内以外では呼び出せません。
posted by RicK at 14:59| Comment(0) | TrackBack(0) | 日記

2010年06月10日

Ruby 文字列リラテル '(シングルコーテーション)と"(ダブルコーテーション)の違い

文字リラテルとは?


'とか"で囲まれた文字です。

'と"とは?


rubyの出力などで使用されます。

環境


ruby1.2.6
irb(rubyのirbで実行します)

'シングルコーテーション


hoge = "1a2b3c"
puts 'hoge'
=> hoge
puts '#{hoge}'
=> '#{hoge}'


"ダブルコーテーション


hoge = "1a2b3c"
puts "hoge"
=> hoge
puts "#{hoge}"
=> 1a2b3c


どうでしょう?上の記述をみて理解できましたか?

解説


ついでにもう一つわかりやすいのを
puts "a\nb"
=> a
b
puts 'a\nb'
=> a\nb


シングルコーテーションは、文字を文字としてしか読込みません。
#{}を文字リラテル中につかってもそれは#と{と}の文字として読込まれてしまいます。

一方ダブルコーテーションは、コードをコードとして読込みます。
#{}などを使用しなくても、改行などのバックスラッシュで始まる特殊文字は
特殊文字として読込みます。
もちろん#{}もその中身はコードという風に判断してくれます。

基本的には"の方が使いやすいですね。
posted by RicK at 15:27| Comment(0) | TrackBack(0) | 日記

2010年06月09日

Ruby on Rails observe_field 2

observe_fieldとは?


前回の記事の記事をご覧下さい。
今回は、
プルダウンを監視、チェックボックスを監視して画像を出すとします。
結果を先に述べますと画像を出す事はできませんでした。
データを渡す事はできたのですが、表示する事ができません。

環境


rails2.2.2
app/views/hoge/hoge.html.erb
app/views/hoge/select_img.html.erb
app/views/hoge/boge.html.erb
app/controllers/hoge_controller.rb

設定方法


vi hoge.html.erb
<%= select("select", "category", Test.college{i.title, i.id}
<%= observe_field("select_category",
 :update => "select_img",
 :url => {:action => "select_img"},
 :with => "value")%<
< div id="select_img"></div>

$ vi select_img.html.erb
<%= unless params[:value].blank? %>
 < input type="radio" name="radio" id="radio_button" value="1"
  onclick="<%= remote_function(:url => {:controller => "hoge", :action => "boge", :with => "value"}) %>
<% end %>

$ vi boge.html.erb
valueを受取って画像を出力する処理


解説


まず、idがselect_categoryのプルダウンを作成。
それをobserve_fieldで監視します。
変更が有った場合、observe_fieldのaction => select_imgが実行されます。
次に、select_img.html.erbが読込まれて、
ラジオボタンが表示されます。
例ではプルダウンの結果からラジオボタンが変動するような処理を加えていませんが、
(ラジオボタンしか表示してないから)
本来は、params[:value]で受取って表示を替えます。
ここがミソなのですが、observe_fieldはラジオボタンが使用できません。
ですので、remote_functionを使用してデータ送信を行います。
これにより、boge.html.erbにラジオボタンのvalueデータは渡るのですが、
データが渡るだけで表示をしてくれないんですよね。
渡ってくるデータもParams{"1" => nil}
こんな形で渡ってくるので正規表現で無理矢理取り出しました。
結局表示ができなくて断念しましたが、
もうちょっとでいけそうなんですけどねぇ。
posted by RicK at 11:12| Comment(0) | TrackBack(0) | 日記

2010年06月07日

Ruby on Rails observe_field

Ruby on Rails observe_field

observe_fieldとは


プルダウンが2つ有るとして、
1つ目を変更したら2つ目が1つ目の条件に対して変動するといった処理を行えます。

環境


rails2.1.1
app/views/hoge/hoge.html.erb
app/views/hoge/small_hoge.js.erb
app/views/hoge_controller.rb

使用方法


$ vi app/views/hoge/hoge.html.erb
<%= select("keyword", "category", Test.collect{i.title, i.id}) %>
//監視されるプルダウン
<%= observe_field("keyword_category"
//この値を見る(上のソース)
:update => "keyword_small_hoge",
//この値の場所を更新する
:submit => "keyword",
:url => {:action => "small_hoge"}
//このaction名のメソッドを呼び出すと同時にsmall_hoge.html.erbを読み込む、[:action => "aa", :id => params[:id]]なども可能
:with => "value"
//keyword_categoryのidをvalueで渡す
) %>
<%= select("keyword", "small_hoge", Test.collect{i.title, i.id}) %>
//更新されるプルダウン


プルダウン以外


view(プルダウンを監視してなにか呼び出す)
更新されるプルダウンだったところを
$ vi hoge.html.rb
<div id="small_hoge"></div>

$ vi small_hoge.js.erb
<%= options_for_select Test.collect{i.title, i.id} %>

$ vi hoge_controller.rb
def small_hoge
render :layout => false
end

とする。
そうするとsmall_hoge.js.erbが呼び出される。そこに表示したいものを書けばよい。
posted by RicK at 16:39| Comment(0) | TrackBack(0) | 日記

2010年06月04日

Ruby on Rails 例外処理 rescue ensure

例外処理 rescue ensureとは?


rubyの例外処理といえば
begin .. rescue .. end

ですよね。
それのrescueとrescueの代わりにいれるensureです。

環境


rails1.2.6
ruby1.8.6
app/controllers/hoge_controller.rb

rescue


$ vi hoge_controller.rb
def hoge
 if hoge.blank?
   raise
  else
   raise
  end
end

見ての通りどうあがいてもエラーが起きる処理です。
では、例外が起きた時に違うところに飛ばしてみましょう。
$ vi hoge_controller.rb
def hoge
 begin
  if hoge.blank?
   raise
  else
   raise
  end
 rescue => e
 logger.error e
 redirect_to :action => "boge"
end

こうすることで、例外が起きた時にbogeに遷移させる事ができます。
ついでになぜエラーが出たのかをログに吐き出しています。

ensure


例外が起きた場合がrescueならばensureは?
答えは、例外が起きようが起きまいが処理を行うです。
$ vi hoge_controller.rb
def hoge
 begin
  if hoge.blank?
   puts 1111111
  else
   raise
  end
 ensure
  resirect_to :action => "boge"
end
end

ifが真であろうと偽であろうとbogeへ遷移します。
posted by RicK at 17:18| Comment(0) | TrackBack(0) | 日記

2010年06月03日

Ruby on Rails strftime 日付変換

strftimeとは?


Dateなどの型をフォーマットしてくれます。
#<DateTime: 212142315037606027/86400000000,3/8,2299161>こんなデータを2010/06/03に変換してくれます。

環境


ruby1.8.6
rails.1.2.6

使い方


今回はコンソールで行います。
以前にも似たような事かいたきもしますが。
$ ruby script/console
date = DateTime
=> #<DateTime: 212142315037606027/86400000000,3/8,2299161>
// こんなん見てもさっぱりわからないので
date.strftime("%Y/%m/%d")
=> "2010/06/03"

といったぐあいです。

フォーマットの種類


フォーマットには色々有ります。
%Y = 年
%m = 月
%d = 日
%H = 時
%M = 分
%S = 秒
%u = 曜(1を月曜として7が日曜で表示)
%F = 年-月-日
%T = 時:分:秒
使うのは大体こんな所ですかね。

曜日


上記のフォーマットは便利ですけど、曜日は面倒ですよね、
番号で出さないでくれよ変換すんの面倒だろぅと。
そんなかたには
date.wday_name
=> "木"

こんなんで曜日が日本語ででてくれます。
date.yearなどで年も取り出せますので、
これだけでフォーマットを作る事も可能です。
posted by RicK at 18:04| Comment(0) | TrackBack(0) | 日記

2010年06月01日

Ruby on Rails date_select

date_selectとは?


railsの便利なformメソッドの中の一つで、
日付を表示する事が可能なメソッドです。
 ・日程
  


日 から
  


日 の間


こんな感じのものを簡単にかけます。
今回書く事は、これの使い方ではなくてパラメータの受け取りがおかしなことになったのでちょっと書いてみます。

環境


rails1.2.6

現象


通常このメソッドを使用すると下記のようなパラメータが渡ってきます。
Parameters: {"date"=>{"start_time(1i)"=>"2010", "start_time(2i)"=>"6", "start_time(3i)"=>"1", "end_time(1i)"=>"2011", "end_time(2i)"=>"6", "end_time(3i)"=>"1"}

これをparams[:date][:start_time(1i)]というふうにして取り出します。
ちょっと面倒ですけどね。

まぁこれはいいんですが、
ページネートを挟んだりした場合なぜかパラメータが
params[:date][:start_time(1i)]としても
start_time(1i)
なぜか上記の値が返ってきます。

dateの中身を見てみると
start_time(1i)2010start_time(2i)6start_time(3i)1end_time(1i)2011end_time(2i)6end_time(3i)1

こんなんなってました。

全部くっついちゃって意味わかんなくなってました。
ページネートのa hrefのURLのなかにパラメータあるんですが、その中身がまぁ上のやつのようにくっついてる訳ですね。

解決策?


問題を解決するにはページネートを解読しないとだめっぽいのですが、
その時は時間がなくて正規表現で無理矢理やっちゃいました。
/#{name}\(#{i}i\)(\d*)/

こんな感じの正規表現(nameとiは変数)で、$1を取得するようにむりやりやってとりあえずおわらせました。

他のメソッドを使うのも一つの手です。
options_for_selectを使用して、年度や日付をプルダウンで表示させて受取る様にすれば恐らく今回の現象は起きないでしょう。
ただし、閏年とか日付は月によって違うので、それを自分で作らなくてはならなくなります。

ちなみに今回の現象は、local(MacOS10.5)のdevelopmentやproductionで起動したときにはおこらず。
サーバのproduction(developmentはためしてない)で起動した時に発生しました。
なぁんか違いがあるんですかねぇ〜。

なにか知っている人いたらおしえてくださぁい。
posted by RicK at 15:12| Comment(0) | TrackBack(0) | 日記

2010年05月26日

Ruby on Rails CRUD

CRUDとは?


Create:作成
Read:読込み
Update:更新
Delete:削除
これらrails以外でも言語の基本中の基本の事ですね。

環境


rails1.2.6
app/controllers/hoge_controller.rb

Create


$ vi hoge_controller.rb
class Hoge < ApplicationController
 def create
  Hoge.create(:text => "hoge")
 end
end


Read


$ vi hoge_controller.rb
class Hoge < ApplicationController
 def index
  @hoge = Hoge.find(:all, :conditions => ["id = ?",1])
 end
end


Update


$ vi hoge_controller.rb
class Hoge < ApplicationController
 def update
  @hoge = Hoge.find(:all, :conditions => ["id = ?",1])
  @hoge.text = "Boge"
  @hoge.save
 end
end


Delete


$ vi hoge_controller.rb
class Hoge < ApplicationController
 def destroy
  @hoge = Hoge.find(:all, :conditions => ["id = ?",1])
  @hoge.destroy
 end
end


今回はビューを全く無視してコントローラー内だけで完結させてみました。
本来はビューからパラメータを受取ってデータを更新したりしますが、
まぁ、基本的に上記と似たようなものです。
posted by RicK at 15:53| Comment(0) | TrackBack(0) | 日記