2017-08-23 3 views
0

私はSinatraでシンプルなワインウェブアプリを作成しようとしています。私のWineモデルのキーは、 "vintner"、 "vintage"、 "varietal"です。ヴィンテージは整数です。私はメモを追加するユーザーのためのノートモデルも持っています(現在はカンマで区切っていますが、後でより堅牢になる予定です)。ここで複数の条件を検出

は私WineController内の私のPOSTアクションです:

post '/wines' do 
    if params[:wine] == "" 
    erb :'wines/new' 
    else 
    @wine = current_user.wines.new(params[:wine]) 
    @wines = current_user.wines 

    if @wines.detect{ |wine| wine.vintner.downcase == 
     @wine.vintner.downcase && wine.varietal.downcase == 
     @wine.varietal.downcase && wine.vintage == @wine.vintage } 
     flash[:message] = "That wine is already in your cellar! Add another." 
     erb :'/wines/new' 
    elsif !params[:note][:name].empty? 
     params[:note][:name].split(", ").each{ |user_note| @wine.notes << 
     Note.find_or_create_by(:name => user_note) } 
    end 
    end 

    @wine.save 
    redirect to "/wines" 
end 

私は何を達成しようとしていることは作成しないでください、そのワイン醸造業者とワイン、品種、ヴィンテージがすでに存在する場合」と言うことですそのメッセージで「新しい」ビューにリダイレクトします。それ以外の場合は、そのワインのインスタンスにメモを追加して保存し、 '/ wines/index'にリダイレクトします。

代わりに、ワインは保存されます(メモは保存されません)。そして、私は上記のメッセージで '/ wines/index'にリダイレクトされます。だから、それは変だ。

私の主な質問は、どのように3つ以上の基準に基づいて(検出や他の方法を使って)検出できますか?また、誰かが私のノートで間違っていることについての洞察を持っているなら、私は聞いてみたい!ありがとうございました!!

+0

これは、オペレーションオーダーの問題です。 '(wine.vintner.downcase == @ wine.vintner.downcase)&&(wine.varietal.downcase == @ wine.varietal.downcase)&&(wine.vintage == @ wine.vintage)'を実行してください。 – moveson

+0

アクティブレコードを使用していますか? –

+0

Sinatraを使用したことはありませんが、 'erb: '/ wines/new''を呼び出すことは実際にメソッドから返されますか?あなたはそれを呼び出すように見え、すべての条件の外でメソッドの最後に '@ wine.save'と' redirect'を続けます。 –

答えて

0

それは現在のライン

@wine.save 
redirect to "/wines" 

がそのコードを実行するように条件params[:wine] == ""が満たされた場合でも、外部ブロックの一番下にすべての条件式であり、書き込まれるように、その場合には、それ@wineが設定されないため、エラーが発生します。

このコードをelsif !params[:note][:name].empty?ブランチに移動して、新しいワインを作成する必要がある場合にのみ実行してください。