2012-02-08 13 views
0

私はRoRを初めて利用しています。次の文を作成します。私は配列を持っています。私は、コード虚偽の返信を返します

def check_warehouse(asset,serial) 
    wh = Warehouse.where(["(asset = ? and serial = ?) OR (asset = ?) OR (serial= ?)",asset,serial,asset,serial]) 
    return false if wh.count > 1 
    return false if 
    wh.each do |wh| 
    wh.position_id != session[:position_id] 
    end 
end 

ですが、それは!なぜ働くいないすべての配列要素は変数value.Thisに等しくない場合に、コントローラはfalseを返したいですか?

また、RoRデータからpdfを生成するために、Rails 3.1で動作するプラグインまたは宝石をお勧めしますか? はあなたにこのようなすべての

+2

動作しません "。何がうまくいかないかを説明する - エラーメッセージを表示したり、何が起こるかなどを記述したりしてください。 –

+2

エラーについて詳しく説明できますか?また、pdfのエクスポートについては、 'whhtmltopdf' – ksol

+0

@marcoをチェックしてください。これがうまくいけば答えを受け入れてください。 –

答えて

2

するTryなめらかありがとう:それは1つの以上の要素を持っている場合は、返す場合は、配列をチェックしても意味がありませんので

def check_warehouse(asset,serial) 
    wh = Warehouse.where(["(asset = ?) OR (serial= ?)",asset,serial]) # first condition was just extra 
    return false if wh.detect {|wh| wh.position_id != session[:position_id] } 
end 

を私はreturn false if wh.count > 1を削除しました。私はあなたを誤解あれば教えてください

UPDあなたはデシベルでそれを行うことができます実際に

return false if wh.each do |wh| 
    wh.position_id != session[:position_id]      
end 

これは道を実行しません。

def check_warehouse(asset,serial) 
    Warehouse.where(
    ["(asset = ? OR serial= ?) AND NOT position_id = ?", asset, serial, session[:position_id]] 
).count.zero? 
end 
3

あなたはこのコードを持っていますあなたは欲しい。ルビーでは、.eachは "ブロック"(do/end間のコード)を実行し、元の配列を返します。だから、

WHが空かない配列、で、あなたが言う場合:

return false if [] 

ルビーはfalseを返しません。代わりに、あなたはおそらく、むしろたい:

return false if wh.any? {|wh| wh.position_id != session[:position_id] } 

おそらく位置がセッション位置であれば、それはtrueを返したいと思うので、あなたはに切り替えることができます:それは「それを言うために有用ではありません

return wh.any?{|wh| wh.position_id == session[:position_id] } 
関連する問題