检测多个条件

时间:2017-08-23 14:49:48

标签: ruby sinatra

我正在尝试用Sinatra创建一个简单的葡萄酒网络应用程序。我的Wine模型中的键是“vintner”,“vintage”和“varietal”。 Vintage是一个整数。我还有一个Note模型供用户添加到笔记中(目前用逗号分隔,计划以后更加健壮......)。

这是我在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'。所以,这很奇怪。

我的主要问题是,如何根据三个或更多标准检测(使用检测或任何其他方法)。此外,如果有人对我的笔记有什么错误有任何见解,我很乐意听到!谢谢!!

1 个答案:

答案 0 :(得分:0)

目前正在写行

@wine.save
redirect to "/wines"

在块的最底部的所有条件之外,因此即使满足条件params[:wine] == "",代码也会运行,并且在这种情况下它会出错,因为@wine没有&# 39; t get set。

尝试将该代码移动到elsif !params[:note][:name].empty?分支中,然后只有在需要创建新酒时才会运行。