Ruby on rails 访问类主体中的变量
我正在尝试在我的应用程序中实现表单对象,使用 在我的控制器中,我执行以下操作:Ruby on rails 访问类主体中的变量,ruby-on-rails,ruby,oop,Ruby On Rails,Ruby,Oop,我正在尝试在我的应用程序中实现表单对象,使用 在我的控制器中,我执行以下操作: class MyController
class MyController
其中MyForm
是一个表单对象,如下所示:
class MyForm
我想做的基本上是:
class MyController
因此,在实例化MyForm
时,我可以按照以下思路做一些事情:
class MyForm
我知道上述方法不起作用,这表明对Ruby的OO模型缺乏理解。有什么方法可以达到相同的效果吗?您可以重载initialize方法。类似的方法应该可以工作,但您可能必须调整参数结构以适应
Muffin
基类:
class MyForm < Muffin::Base
def initialize(options = {})
if options[:array_of_attribute_names].present?
options[:array_of_attribute_names].each do |attribute_name|
attribute attribute_name
end
end
super
end
end
只是重复一下NM Pennypacker提供的答案 如果您想这样做:
@form = MyForm.new(array_of_attribute_names: array_of_attribute_names)
那么你似乎可以做到:
class MyForm < Muffin::Base
def initialize(options={})
class_eval do
options[:array_of_attribute_names].each do |attribute_name|
attribute attribute_name
end if options[:array_of_attribute_names]
end
super
end
end
class MyForm < Muffin::Base
def initialize(options=[])
class_eval do
options.each do |attribute_name|
attribute attribute_name
end
end
super
end
end
那么你似乎可以做到:
class MyForm < Muffin::Base
def initialize(options={})
class_eval do
options[:array_of_attribute_names].each do |attribute_name|
attribute attribute_name
end if options[:array_of_attribute_names]
end
super
end
end
class MyForm < Muffin::Base
def initialize(options=[])
class_eval do
options.each do |attribute_name|
attribute attribute_name
end
end
super
end
end
class MyForm
您是否需要动态列表?您是否查看了dry rb
生态系统,特别是dry validation
gem它可能有类似的功能,并且是一个维护非常严格的gem,只是一个建议def initialize(options=[])不容易一点吗
?(OP似乎没有表示除了属性名称的数组之外的任何内容都将被传入。)如果坚持传入哈希,如果选项[:属性名称的数组],您将不能执行,这将是零还是否?如果使用传入的数组,您不能完全消除If
条件吗?这也可以。我只是按照惯例去做。我只是想OP可以使用该键并传递一个数组作为值。感谢您的回答,不幸的是,这不起作用。请参阅我对jvillian回答的评论。谢谢您的回答。不幸的是,当我尝试此操作时,我得到了#
的未定义的方法“attribute”错误。我认为这是因为#attribute
是一种类方法,它可以在MyForm
(一个class
的实例)上使用,但不能在MyForm
的任何实例上使用。在这种情况下,我可以访问这个方法吗?我担心使用class\u eval
意味着我回到了原点,因为我现在可以访问这个方法,但是我不再有选项
散列可供我使用。我不知道“不再有选项散列可供我使用”是什么意思。请多说。毕竟,您可以简单地将其分配给一个实例变量,然后就可以开始了。除了原始问题中描述的选项之外,您希望对其他选项做什么?