saveとsave!
saveは失敗時にfalseを返す。
@hoge = Hoge.new(:name => "piyo")
if @hoge.save
p "ゆっくりしていってね!"
else
p "ぬるぽ"
end
save!は失敗時に例外を返す。
@hoge = Hoge.new(:name => "piyo")
begin
@hoge.save!
p "ゆっくりしていってね!"
rescue
p "ぬるぽ"
end
トランザクション内(ロールバック可能)の時は、ふつうはsave!。
@hoge = Hoge.new(:name => "piyo")
begin
Hoge.transaction do
@hoge.save!
end
p "ゆっくりしていってね!"
rescue
p "ぬるぽ"
end
ちなみにtransactionを生やしてるクラスはHogeってより、親クラスなので、以下な感じでいいかも。
@hoge = Hoge.new(:name => "piyo")
begin
ActiveRecord::Base.transaction do
@hoge.save!
end
rescue => ex
logger.error("【例外発生】:" + ex.message + "\n" + ex.backtrace.join("\n"))
end
form関連
- 特定のモデルに結びついたform_for, text_field、そうではない時のform_tag, text_filed_tag。
- text_fieldの場合、パラメータやキーもハッシュ化される(params[:aaa][:bbb])。
<%= form_for(@foo) do |f| %>
<%= f.text_field :name %>
<%= f.submit %>
<% end %>
# create アクション
@foo = Foo.new(params[:foo])
# update アクション
@foo = Foo.find(params[:id])
@foo.update_attributes(params[:foo])
クラスとか
- @はじまりがインスタンス変数、@@はじまりがクラス変数、$はじまりがグローバル変数(宣言は不要)。
- アルファベット大文字 ([A-Z]) で始まる識別子は定数。
class Sequence
include Enumerable # Enumerable モジュールのメソッドを読み込む。
# 自動的に呼び出される初期化メソッド。
def initialize(from, to, by)
@from, @to, @by = from, to, by # @始まりのインスタンス変数に多重代入。
end
def length
return 0 if @from > @to
Integer( (@to - @from) / @by ) + 1
end
# 別名登録
alias size length
end
class Point
attr_accessor :x, :y # セッタとゲッタを設定。(以前はattrだけだった)
# attr_reader :x, :y # イミュータブル(値を変更しない)ならこちら。
@@n = 0 # 作成したPointの数
def initialize(x, y)
@x, @y = x, y
end
def self.report
p "作成されたPointの数=#@@n"
end
end
p = Point.new(0, 0)
selfが付くとクラスメソッド、付かないとインスタンスメソッド
インスタンスメソッドは、インスタンスを生成してそこからでないと呼べない。
クラスメソッドなら、(インスタンスを作成せずに)そのまま呼べる。
class Benri
def plus_one
end
def self.plus_two
end
ちなみに、クラスメソッドの中でのselfはクラスを指し、インスタンスメソッド内ではそのインスタンスを指す。
privateと書いた行より後のメソッドはプライベート(上にパブリックメソッドがある)。
nil? empty? blank? present?
- nilは存在しない、emptyは入れ物はあるけど空っぽ、nilとemptyを合わせたのがblank、blankの反対がpresent。
Rails
ActiveSupport
Railsのもっとも汎用的なライブラリ。
require 'active_support'
nil?とempty?はrubyのメソッドで、blank?とpresent?はrailsで拡張されたメソッド。
blank?は、nilも空も半角スペース/タブ/改行もtrue。
" ".blank?
=> true
# 複数形化
"card".pluralize
=> "cards"
# 単数形化
"cards".singularize
=> "card"
"ActiveRecord::Base".undersocre
=> "active_record/base"
"active_record/base".camelize
=> "ActiveRecord::Base"
"ActiveRecord::Base".constantize
=> ActiveRecord::Base
# 変数から定数
SAKAI = 'yugo'
p 'SAKAI'.constantize
=> "yugo"
# モデル.new
'sakai_report'.camelize.constantize.new
Time.days_in_month(2, 2000)
=> 29
Time.days_in_month(2, 2011)
=> 28
['a', 'b', 'c'].to_json
=> ["a", "b", "c"]
{:name => 'Tama', :type => 'Cat'}.to_json
=> {"name":"Tama","type":"Cat"}
121.multiple_of?(11)
=> true
122.multiple_of?(11)
=> false
ActiveRecord
クラス=テーブル、属性=カラム。
クラス=ActiveRecord::Baseの派生クラス。app/models配下に配置。
Railsは複合主キーには対応していません。開発を簡単にするために、複合主キーは避けるのがよいでしょう。レガシーデータベースを使うといった制約がある場合は、一意になるプライマリキーを新しく追加するなどして回避するのがおすすめです。
class User < ActiveRecord::Base
set_table_name :kaiin
set_primary_key :member_code
end
# INSERT
user = User.new(:name => ‘Taro’, :email => ‘taro@everyleaf.com’)
user.save
# 違う書き方
user = User.new
user.name = 'Taro'
user.email = 'taro@everyleaf.com'
# 更新
user = User.find(requested_id)
user.name = ‘Jiro’
user.save
# 削除
user = User.find(requested_id)
user.destroy
# 特定IDのレコード参照
user = User.find(requested_id)
User.find(1)
User.last
User.find(1, 2)
# 1000件(初期値)ずつ取得して1件ずつループ。
User.find_each do |user|
…
end
# 5000件ずつに変更。
User.find_each(:batch_size => 5000) do |user|
…
end
# 検索
User.all(:conditions => [‘age = ?’, 31])
User.all(:conditions => [‘age = ?’, 31], :order => ‘created_at desc’, :limit => 20)
User.where(:age => 31)
User.where(:age => [31, 32])
User.where(:age => 30..40) # 範囲
# プレースホルダ
User.where('age = ? AND name = ?', 31, 'jugyo')
Ruby and Perl
Ruby | Perl |
---|---|
#!ruby |
#!perl |
<<EOS |
<<EOS |
<<'EOS' |
<<'EOS' |
<<"EOS" |
<<"EOS" |
# 末尾の識別子(EOS)の行頭にインデントが可能。 |
#
|
<<"EOS" |
#
|
name = '鈴木' + '一郎' |
my $name = '鈴木' . '一郎'; |
name = '鈴木'; |
my $name = '鈴木'; |
'あ' * 10 |
'あ' x 10 |
name = '鈴木' |
my $name = '鈴木'; |
10進数 214 |
10進数 214 |
3_420_500
|
3_420_500
|
# 四則演算等 |
# 四則演算等 |
# 引数をそのまま出力。 |
#
|
# コメント |
# コメント |
# 変数の1文字目数字NG |
#
|
num += 2 num += 1 |
$num += 2; $num ++; |
# falseとnilは偽 |
#
|
# 関係演算子 |
# 関係演算子 |
# thenは省略可。 |
if (num == 10) { |
array = [2005, 2006, 2007, 2008] |
my @array = (2005, 2006, 2007, 2008); |
for value in array do |
for my $value (@array) { |
hash = {'name' => 'sakai', 'address' => 'Tokyo'} |
my %hash = (name => 'sakai', address => 'Tokyo'); |
hash.each{|key, value| |
while (my ($key, $value) = each %hash) { |
def print_hello |
sub print_hello { |
value1, value2 = method(3, 7) |
my ($value1, $value2) = method(3, 7); |
# 整数→浮動小数点数 |
#
|
class Person |
my $person = Person->new; |
# 継承とスーパメソッドの呼び出し |
package Baker; |
text = 'hello'; |
my $text = 'hello'; |
array.length |
#
|
t = Time.now |
#
|
rbenv |
plenv |
b = a.push(5) # あるいは b = a << 5 # 末尾に追加 |
my @b = push @a, 5; # 末尾に追加 |
text = "aa-bb-cc" |
my $text = 'aa-bb-cc'; |
# 構文チェック |
# 構文チェック |
#
|
#
|
表記ルール抜粋
# 真偽値を返すメソッド名は、動詞または形容詞に`?'を付け、形容詞に `is_'は付けない。
visible?
# 破壊的なメソッドと非破壊的なメソッドの両方を提供する場合、破壊的なメソッドには`!'を付ける。
split
split! # splitの破壊的バージョン