我正在尝试使我的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
有没有人对如何获得语法上的快乐有任何建议?
答案 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