2009年12月15日

blank? nil? zero?

nil? zero? blank? の動きの違い。

0.nil? #=> false
0.zero? #= true
0.empty? #=> NoMethodError
0.blank? #=> false
0 == false #=> false

"".nil? #=> false
"".zero? #=> NoMethodError
"".empty? #=> true
"".blank? #=> true
"" == false #=> false

{}.nil? #=> false
{}.zero? #=> NoMethodError
{}.empty? #=> true
{}.blank? #=> true
{} == false #=> false

[].nil? #=> false
[].zero? #=> NoMethodError
[].empty? #=> true
[].blank? #=> true
[] == false #=> false

nil.nil? #=> true
nil.zero? #=> NoMethodError
nil.empty? #=> NoMethodError
nil.blank? #=> true
nil == false #=> false

false.nil? #=> false
false.zero? #=> NoMethodError
false.empty? #=> NoMethodError
false.blank? #=> true
false == false #=> true
posted by えいじ at 15:12| Comment(66) | TrackBack(0) | 基本 | このブログの読者になる | 更新情報をチェックする

Rubyの演算子の優先順位

Rubyには AND,OR を表す演算子が2種類あります。

&& ||
and or

ですが、どちらを使った方がいいのか、という議論がありました。
僕は and,or 派で、それは演算子の優先順位が低いから。
実際、あまり問題になる事は無いのですが、次のようなケースでは結果が違ってきます。

i = 0; i = 1 and i == 1
#=> true
i
#=> 1

i = 0; i = 1 && i == 1
#=> false
i
#=> false

優先順位が分かるように括弧をつけると。

i = 0; (i = 1) and (i == 1)
i = 0; i = (1 && (i == 1))

上の場合は、iには1がはりますが、下の場合には、iにfalseが入ります。
posted by えいじ at 12:05| Comment(30) | TrackBack(0) | 基本 | このブログの読者になる | 更新情報をチェックする

Railsでインスタンスのコピー

Railsでインスタンスのコピーを作りたいときに、邪魔になるのが
attr_protected
これがあると、attributes= でコピーされない属性が出てくる。
とは言え、セキュリティーを考えると、attr_protectedを指定しない事は考えられないので、インスタンスのコピーをしたい場合は次のように行う。


class User < ActiveRecord::Base
attr_protected :is_admin
end
user = User.new
user.attributes = {:username=>'Phusion', :is_admin=>true}
user.username # => "Phusion"
user.is_admin? # => false

user.send(:attributes=, {:username=>'Phusion',:is_admin=>true}, false)
user.is_admin? # => true

posted by えいじ at 09:37| Comment(26) | TrackBack(0) | 基本 | このブログの読者になる | 更新情報をチェックする

2009年09月08日

サブクエリを含む Condition の作り方

プラグイン condition builder にサブクエリを加える方法。
最後の and メソッドの「sql」指定では第2引数がそのまま and で繋がる。

cnd = Condition.new
cnd.and('items.id', [1,2,3,4])
cnd.and do |c|
 c.or('items.start_at', 'is', nil)
 c.or('items.start_at', '<=', Time.now)
end
cnd.and('sql', 'exists (select * from liquors where iquors.item_id = items.id)')

Item.find(:all, :conditions=>cnd.where)
を実行すると次のSQL文が発行されます。

SELECT * FROM items
WHERE (items.id IN (1,2,3,4)
 AND (items.start_at is NULL OR items.start_at <= '2009-09-08 10:54:42')
 AND exists (select * from liquors where iquors.item_id = items.id))

posted by けんいちうじ at 10:58| Comment(50) | TrackBack(0) | プラグイン | このブログの読者になる | 更新情報をチェックする

2009年06月26日

Ruby Enterprise Edition + Passenger + mod_rewrite

Ruby Enterprise Edition + Passenger を導入してみました。

インストール方法や、効果については沢山の方が言及しているようなので割愛させてもらいます。

いくつか問題が発生したので対応策を。

■connection error が多発

確認のためサイトを巡回していると、何回かに一回
Mysql::Error: Lost connection to MySQL server during query
というエラーが出た。

gem install mysql

で解決

■mod_rewriteとの併用

困ったのは、mod_rewriteに関して。

virtualhostに以下を設定して動かしたんですが、rewriteが効いてない模様。。。


PassengerHighPerformance on
PassengerMaxPoolSize 30
PassengerMaxInstancesPerApp 0
PassengerPoolIdleTime 300
PassengerMaxRequests 0

<VirtualHost *:80>
ServerName rails.sample.jp
DocumentRoot /path-to-rails/public
<Directory "/path-to-rails/public">
Options -Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>

RailsAllowModRewrite on

RewriteEngine On

RewriteCond %{DOCUMENT_ROOT}/maintenance.html -f
RewriteCond %{REMOTE_ADDR} !^192\.168\.
RewriteRule . /maintenance.html [L]

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/(.*)$ /%{REQUEST_URI} [P,QSA,L]

ProxyRequests Off
ErrorLog "|/usr/sbin/rotatelogs /var/log/apache2/rails.sample.jp_error.log.%Y%m%d 86400 540"
LogLevel warn
CustomLog "|/usr/sbin/rotatelogs /var/log/apache2/rails.sample.jp_access.log.%Y%m%d 86400 540" combined
ServerSignature Off
</VirtualHost>



Phusion Passenger users guide


ここに書いてある通り。
『PassengerHighPerformance』をoffにしないと、mod_rewriteは動作しない。
パラメータ名に期待して、ついつい『on』にしてしまったが為の罠



posted by しょうじ at 16:14| Comment(28) | TrackBack(1) | 環境 | このブログの読者になる | 更新情報をチェックする

2009年06月17日

flash データが次々画面に残る理由

flash メッセージが意図した画面から遷移後に残ってしまうときがある。
これは、flash が2回目のリクエストまで保持されるセッションスコープのデータだから。
メッセージ以外にも使用可能だが、おそらくリダイレクト後のメッセージ用に用意されているものだろう。

リダイレクトしないときは、その次のリクエストのレスポンスに残ってしまう。
このときは、次のように flash へ代入する。

flash.now[:notice] = "リダイレクトしませんでした。"

取り出すとき(ビュー)は、通常と同じ。

<%= flash[:notice] %>

です。

posted by けんいちうじ at 10:45| Comment(17) | TrackBack(0) | 基本 | このブログの読者になる | 更新情報をチェックする

2009年05月28日

has_and_belongs_to_manyのforeign_keyにsymbolが使えない (2.0.2)


def User < ActiveRecord::Base
has_and_belongs_to_many :clubs, :join_table=>:club_members, :foreign_key=>:member_id
end
user = User.find(1)
user.club_ids = [11,12]
# INSERT INTO club_members(`club_id`) VALUES(11)
# INSERT INTO club_members(`club_id`) VALUES(12)
# member_idが入らない!



def User < ActiveRecord::Base
has_and_belongs_to_many :clubs, :join_table=>:club_members, :foreign_key=>"member_id"
end
user = User.find(1)
user.club_ids = [11,12]
# INSERT INTO club_members(`club_id`,`user_id`) VALUES(11,1)
# INSERT INTO club_members(`club_id`,`user_id`) VALUES(12,1)
posted by えいじ at 14:27| Comment(29) | TrackBack(0) | 基本 | このブログの読者になる | 更新情報をチェックする

modelの初期化とselect指定

modelの初期化でafter_initializeを使いますが、次のようなケースでエラーとなります。

class User < ActiveRecord::Base
def after_initialize
self.gender ||= "male"
end
end
User.find(1) # OK
Usre.find(1, :select=>"id,age") # ERROR
# ActiveRecord::MissingAttributeError: missing attribute: gender

これは、select指定した場合に、genderのattributeがインスタンスに無いため起こるエラーです。なので、冗長ですが、次のように書いておく方が無難かもしれません。特に、現行システムで初期化する項目を追加するときなどに。

class User < ActiveRecord::Base
def after_initialize
self.gender ||= "male" if self.has_attribude?(:gender)
end
end
User.find(1) # OK
Usre.find(1, :select=>"id,age") # OK
# ActiveRecord::MissingAttributeError: missing attribute: gender


posted by えいじ at 10:45| Comment(15) | TrackBack(0) | 基本 | このブログの読者になる | 更新情報をチェックする

2009年05月27日

ActiveRecordのfindとinclude

ActiveRecordのselectとincludeを同時に指定すると、includeがselectを上書きして、selectの指定が無効になってしまいます。
posted by えいじ at 18:41| Comment(13) | TrackBack(0) | 基本 | このブログの読者になる | 更新情報をチェックする

2009年02月27日

floatよ。

今まで気づかなかったけど、rubyのfloatってCのfloatなんだね。
なので、

1.2 - 1.0 == 0.2
=> false

みたいなことが起こる。
こんなときは、decimalに限る。
Railsであればto_dってメソッドがあります。

1.2.to_d - 1.0.to_d == 0.2.to_d
=> true

posted by えいじ at 23:26| Comment(16) | TrackBack(0) | 基本 | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。