Rails 4.x before_action with params?

时间:2015-07-25 00:16:46

标签: ruby-on-rails controller

我正在尝试使我的rails代码更好。

我有这个:

for R in range(N)

我想做一些如何到达这里:

class MyController < ApplicationController
  before_action do
    # @variable_defined_else_where is an object w/ accessors
    @variable_defined_else_where.some_value = "string"
  end
end

我查看了rails actionview代码,其中“layout”具有类似的语法

class MyController < ApplicationController
  variable_defined_else_where(some_value: "string")
  # or
  variable_defined_else_where.some_value = "string"
  # or
  some_method "string"
end

但是,它在类中声明了一个方法,我需要修改一个

class MyController < ApplicationController
  layout "string"
end

然后控制几位助手的行为

 @variable_defined_else_where

有没有人对如何获得语法上的快乐有任何建议?

1 个答案:

答案 0 :(得分:1)

由于before_action在实例上下文中执行,因此您的可变变量是一个实例变量,这意味着它只在控制器的实例上设置(即,在请求生命周期中)。另一方面,layout很可能在控制器类本身上设置属性。

如果您的变量可以移动到类级而不会影响线程安全性,那么您可以将其设置为类属性并直接设置为:

class MyController < ApplicationController
  @@my_variable = 3

  def test
    @@my_variable   # returns 3
  end
end

但如果你不喜欢@标志的外观,那可能并不是更好:)

这是另一个选项,它只是将您的before_action定义包装在类方法中:

module SetsSomeVariable
  include ActiveSupport::Concern

  module ClassMethods
    def set_variable(value)
      self.before_action do
        @my_variable = value
      end
    end
  end
end

# ...

class MyController < ApplicationController
  include SetsSomeVariable  # this could be in ApplicationController

  set_variable 'string'
end