私は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つ以上の基準に基づいて(検出や他の方法を使って)検出できますか?また、誰かが私のノートで間違っていることについての洞察を持っているなら、私は聞いてみたい!ありがとうございました!!
これは、オペレーションオーダーの問題です。 '(wine.vintner.downcase == @ wine.vintner.downcase)&&(wine.varietal.downcase == @ wine.varietal.downcase)&&(wine.vintage == @ wine.vintage)'を実行してください。 – moveson
アクティブレコードを使用していますか? –
Sinatraを使用したことはありませんが、 'erb: '/ wines/new''を呼び出すことは実際にメソッドから返されますか?あなたはそれを呼び出すように見え、すべての条件の外でメソッドの最後に '@ wine.save'と' redirect'を続けます。 –