如何使用ruby on rails创建带有常量哈希的case(switch)语句?

时间:2014-09-09 11:46:16

标签: ruby-on-rails ruby switch-statement metaprogramming

除了使用哈希和一些元编程之外,我想创建此代码的等效代码。

def current_verb
  case params[:controller]
  when "apps"
    @current_verb = "MADE "
  when "articles"
    @current_verb = "LEARNED "
  when "articles"
    @current_verb = "WONDERED " # Change later to specify articles with a certain tag.
  else
    @current_verb = "IS "
  end
end

直观地说,我尝试过类似的东西,但似乎无效。 到目前为止,我在application_controller.rb

中有这个
class ApplicationController < ActionController::Base

  before_action :current_verb

  private
    verbs = { pages: "IS",
              apps: "MADE",
              articles: "TAUGHT", 
              articles: "WONDERED"
            }

    def current_verb
      case params[:controller]

      verbs.each |key, value| do
        # need this to spit out literal code, not evaluate code
        when key
          @current_verb = value
      end

      else
        @current_verb = verbs[:pages]
      end
    end

关于这一点的棘手部分是我认为我不能使用define_methodsend因为循环部分不是整个方法。谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

看起来你只是在哈希中查找键并返回其值。唯一需要注意的是,如果找不到ke,那么您希望返回默认值"IS"。我建议使用Hash#fetch

class ApplicationController < ActionController::Base
  VERBS = { pages: "IS",
            apps: "MADE",
            articles: "TAUGHT", 
            articles: "WONDERED"
          }.stringify_keys.freeze

  before_action :set_current_verb

  private

  def set_current_verb
    @current_verb = VERBS.fetch(controller_name) { "IS" }
  end
end

请注意,我将VERBS设为常量,以便set_current_verb方法可见。我将它包含在private指定之上,因为常量不能是私有的。在VERBS方法中使用set_current_verb哈希将导致每次都对它进行求值,因此常量仍然是更好的解决方案。此外,controller_name因其表现力而优先于params[:controller],因为如果将来存在任何名称空间,它将避免返回名称空间。

此外,VERBS哈希似乎有两个相同的键。我认为这只是一个错字,可以由你纠正。