在Ruby中检查多个参数
这些在Ruby中检查多个参数,ruby,sinatra,params,Ruby,Sinatra,Params,这些params来自erb模板中的html输入(此代码在主应用程序.rb中),在将它们添加到n.requestusers之前,我正在检查它们是否已填充,这将成为数据库条目的一部分。它可以工作,但现在的感觉更像是bash脚本。写这样的东西最好的方法是什么 主干道中的路线。rb if params[:user2].empty? && params[:user3].empty? && params[:user4].empty? && params[:us
params
来自erb模板中的html输入(此代码在主应用程序.rb
中),在将它们添加到n.requestusers
之前,我正在检查它们是否已填充,这将成为数据库条目的一部分。它可以工作,但现在的感觉更像是bash脚本。写这样的东西最好的方法是什么
主干道中的路线。rb
if params[:user2].empty? && params[:user3].empty? && params[:user4].empty? && params[:user5].empty?
n.requestusers = params[:user1]
elsif params[:user3].empty? && params[:user4].empty? && params[:user5].empty?
n.requestusers = params[:user1], params[:user2]
elsif params[:user4].empty? && params[:user5].empty?
n.requestusers = params[:user1], params[:user2], params[:user3]
elsif params[:user5].empty?
n.requestusers = params[:user1], params[:user2], params[:user3], params[:user4]
else
n.requestusers = params[:user1], params[:user2], params[:user3], params[:user4], params[:user5]
end
我对Sinatra不太熟悉,但如果您想向数组中添加元素,可以这样做(假设
n.requestusers
已经初始化):
这将确保它添加参数(如果存在)。您可能对以下内容感兴趣,而不是所有这些条件语句:
n.requestusers = params.select { |key, val| not val.empty? }.values
或者@theTinMan建议的更干净的方式:
n.requestusers = params.reject { |key, val| val.empty? }.values
用于获取所有非空参数值并返回它们。可以将这些值作为数组抓取
我对web框架没有经验,所以我的建议有点冒险。这没有经过测试,因为没有样本值可供测试,但是,经过一些重构后,我有:
if [:user2, :user3, :user4, :user5].all?{ |s| params[s].empty? }
n.requestusers = params[:user1]
elsif [:user3, :user4, :user5].all? { |s| params[s].empty? }
n.requestusers = [:user1, :user2].map{ |s| params[s] }
elsif [:user4, :user5].all? { |s| params[s].empty? }
n.requestusers = [:user1, :user2, :user3].map{ |s| params[s] }
elsif params[:user5].empty?
n.requestusers = [:user1, :user2, :user3, :user4].map{ |s| params[s] }
else
n.requestusers = [:user1, :user2, :user3, :user4, :user5].map{ |s| params[s] }
end
进一步看,这似乎是明智的:
USER_LIST = [:user1, :user2, :user3, :user4, :user5]
USER_LIST.size.times do |i|
user_list = USER_LIST
get_users = user_list.shift(1 + i)
if user_list.all?{ |s| params[s].empty? }
n.requestusers = params.values_at(get_users)
break
end
end
就像我说的,这没有经过测试,但我会按照这些思路来做
根据需要调整
用户列表
。如果您不知道,除非
转换为如果不知道
。您想分享您的观点吗?可能有比发送一组参数[:userX]更好的方法来实现这一点。也许一个params[:users]?+1两件事可以让它更像Ruby。通常,使用而不是代码>。对于此代码,不要使用选择
,而是使用拒绝{k,v | v.empty?}
,因为不是
或代码>让我们在头脑中翻转逻辑。切换到拒绝
取决于清空?
测试的成功。@theTinMan我同意你的看法。我完全忽略了拒绝。这更直观。我注意到这些事情是因为我不喜欢我的头受伤。:-)对这正是我一直在寻找的东西!:)谢谢
if [:user2, :user3, :user4, :user5].all?{ |s| params[s].empty? }
n.requestusers = params[:user1]
elsif [:user3, :user4, :user5].all? { |s| params[s].empty? }
n.requestusers = [:user1, :user2].map{ |s| params[s] }
elsif [:user4, :user5].all? { |s| params[s].empty? }
n.requestusers = [:user1, :user2, :user3].map{ |s| params[s] }
elsif params[:user5].empty?
n.requestusers = [:user1, :user2, :user3, :user4].map{ |s| params[s] }
else
n.requestusers = [:user1, :user2, :user3, :user4, :user5].map{ |s| params[s] }
end
USER_LIST = [:user1, :user2, :user3, :user4, :user5]
USER_LIST.size.times do |i|
user_list = USER_LIST
get_users = user_list.shift(1 + i)
if user_list.all?{ |s| params[s].empty? }
n.requestusers = params.values_at(get_users)
break
end
end