【问题标题】:More concise way of writing this array inclusion / default fallback code?编写此数组包含/默认后备代码的更简洁方式?
【发布时间】:2013-07-26 22:51:36
【问题描述】:

我发现我已经在我的 Rails 控制器中多次这样做了,我有兴趣找到一种更好的方法来写出来(如果可能的话)。本质上,我正在验证几个选项的输入,如果输入与任何选项都不匹配,则使用默认值。

valid_options = %w(most_active most_recent most_popular)
@my_param = valid_options.include?(params[:my_param]) ? params[:my_param] : 'most_recent'

【问题讨论】:

  • 我不认为你现在的做法有什么问题。比这更简洁,你最终会牺牲几个字符的可读性

标签: ruby default-value ternary-operator sanitization input-sanitization


【解决方案1】:

如果你使用散列而不是数组,它会更快更干净。而且,由于您的默认值为"most_recent",因此在valid_options 中包含"most_recent" 是多余的。你最好把它去掉。

filter_options =
Hash.new("most_recent")
.merge("most_popular" => "most_popular", "most_active" => "most_active")

@my_param = filter_options[params[:my_param]]

【讨论】:

  • 谢谢,我在想类似散列的东西会更快,我可以使用 #fetch 方法作为后备值,但是向 @ 提供后备值的想法987654326@运营商其实是个好主意,我喜欢!将问题留待一会儿看看是否还有其他想法,但如果没有更好的想法,那么我可能会接受这个。
  • 欢迎接受任何答案。使用fetch 也可以。
【解决方案2】:

我也会走 Hash 路线。

这是可以想象的:

Hash[valid_options.zip valid_options].fetch(params[:my_param], "most_recent")

【讨论】:

    【解决方案3】:

    有点牵强。

    valid_options = %w(most_active most_recent most_popular)
    (valid_options & [params[:my_param]]).first || 'most_recent'
    

    【讨论】:

      【解决方案4】:

      下面的情况如何:

      valid_options = %w(most_active most_recent most_popular)
      valid_options.detect(proc{'default_value'}){|i| i == params[:my_param] }
      

      另一个:

      valid_options = %w(most_active most_recent most_popular)
      valid_options.dup.delete(params[:my_param]) { "default" }
      

      【讨论】:

        猜你喜欢
        • 2012-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-21
        • 2018-06-05
        • 1970-01-01
        • 2012-02-09
        • 1970-01-01
        相关资源
        最近更新 更多