【问题标题】:How can I dry this Rails Controller Action further我怎样才能进一步干燥这个 Rails 控制器动作
【发布时间】:2012-11-15 20:48:31
【问题描述】:

我们的应用程序使用了多种环境,因此我们可以在不破坏任何东西的情况下试验设置。在一个典型的控制器动作中,我有这样的事情:

def some_action    
  ...
  if @foo.development_mode == 'Production'           
    @settings = SomeHelper::Production.lan(bar)
  elsif @foo.development_mode == 'Beta'
    @settings = SomeHelper::Beta.lan(nas)
  elsif @foo.development_mode == 'Experimental'
    @settings = SomeHelper::Experimental.lan(nas)
  end
  ...
 end

由于我们有几十个这样的,我想我可以尝试用这样的东西来干掉事情:

 @settings = "SomeHelper::#{@foo.development_mode}.lan(bar)"

这显然行不通 - 我只是得到:

 "NasHelper::Production.lan(bar)"

我怎样才能减少这种情况,还是我必须坚持我所拥有的??

【问题讨论】:

    标签: ruby-on-rails-3 dry


    【解决方案1】:

    如果您担心最终得到的是 String 而不是对象,您可以使用 String.constantize(仅限 Rails,使用标准 Ruby 您必须实现它;它使用 Object.const_get(String) )

    另一个选项是.const_get(例如Object.const_get(x),其中 x 是您的字符串),它本身不能正确嵌套,因此您必须在“::”处拆分,等等。

    此外,还可以选择使用eval 来评估字符串。 但请注意:eval 应谨慎使用(它很强大),或者根本不用。

    编辑:

    这意味着,而不是:

     @settings = "SomeHelper::#{@foo.development_mode}.lan(bar)"
    

    你可以跑:

     @settings = "SomeHelper::#{@foo.development_mode}".constantize.lan(bar)
    

    有用的来源:

    http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-constantize

    http://www.ruby-forum.com/topic/183112

    http://blog.grayproductions.net/articles/eval_isnt_quite_pure_evil

    【讨论】:

      【解决方案2】:

      第一种情况,@settings接收SomeHelper::Production.lan(bar)方法的结果;第二个,@settings 只是得到一个字符串。您可以使用send method of Object linked hereeval 来触发该方法,但这不是我的首选。

      看起来您可能正在重新发明一个轮子——Rails 已经将“环境”的概念很好地连接到了所有东西中——它们在app/config/environments 中定义。您在启动服务器时设置环境,并且可以像Rails.env.production? 一样进行测试。要创建新环境,只需复制最接近新环境的现有环境文件,例如将production.rb 复制到beta.rb 并根据需要进行编辑,然后测试Rails.env.beta?,例如。

      但这仍然会让你到处测试哪一个。您可以添加到config 哈希(例如config.some_helper.lan = 'bar'),您可以直接将其分配给@settings。您必须确保有默认值或在所有环境中都定义了默认值,但我认为这可能是正确的方法......不知道您的目标是什么。

      【讨论】:

      • 我们了解环境,但这些操作适用于已连接的设备,这些设备根据其父环境获得不同的设置。我知道有点混乱。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-15
      • 2016-11-25
      • 2023-02-09
      • 2012-09-21
      相关资源
      最近更新 更多