除了使用哈希和一些元编程之外,我想创建此代码的等效代码。
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_method
或send
因为循环部分不是整个方法。谢谢你的帮助。
答案 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
哈希似乎有两个相同的键。我认为这只是一个错字,可以由你纠正。