Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ruby中检查多个参数_Ruby_Sinatra_Params - Fatal编程技术网

在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