2017-08-23 37 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?分支中,然后只应在需要创建新酒时运行。