我正在尝试用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'。所以,这很奇怪。我的主要问题是,如何根据三个或更多标准检测(使用检测或任何其他方法)。此外,如果有人对我的笔记有什么错误有任何见解,我很乐意听到!谢谢!!
答案 0 :(得分:0)
目前正在写行
@wine.save
redirect to "/wines"
在块的最底部的所有条件之外,因此即使满足条件params[:wine] == ""
,代码也会运行,并且在这种情况下它会出错,因为@wine
没有&# 39; t get set。
尝试将该代码移动到elsif !params[:note][:name].empty?
分支中,然后只有在需要创建新酒时才会运行。