2017-08-23 35 views
0

我正嘗試用Sinatra創建一個簡單的葡萄酒網絡應用程序。我的葡萄酒模型中的關鍵是「葡萄酒」,「葡萄酒」和「品種」。葡萄酒是一個整數。我還有一個筆記模型供用戶在筆記中添加(目前以逗號分隔,稍後會計劃更加健壯...)。檢測多個條件

這是我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'「。

然而,葡萄酒保存(筆記並未被保存,雖然),我被重定向到'/葡萄酒/索引'與上述消息。所以,這很奇怪。

我的主要問題是,如何根據三個或更多標準檢測(使用檢測或任何其他方法)。另外,如果任何人有任何洞察我的筆記做錯了,我很樂意聽到!謝謝!!

+0

這可能是一個操作順序問題。嘗試做'(wine.vintner.downcase == @ wine.vintner.downcase)&&(wine.varietal.downcase == @ wine.varietal.downcase)&&(wine.vintage == @ wine.vintage)''。 – moveson

+0

你在使用Active Record嗎? –

+0

從未使用過Sinatra,但確實調用'erb:'/ wines/new''實際上從方法返回?看起來像你打電話,並繼續在所有條件之外的方法底部的'@ wine.save'和'重定向' –

回答

0

由於它目前的書寫線條

@wine.save 
redirect to "/wines" 

是外面塊的最底部所有的條件,這樣的代碼將運行,即使條件params[:wine] == ""得到滿足,在這種情況下,它將會出錯,因爲@wine沒有設置。

嘗試將該代碼移動到可能的elsif !params[:note][:name].empty?分支中,然後只應在需要創建新酒時運行。