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
意味着我回到了原点,因为我现在可以访问这个方法,但是我不再有
选项
散列可供我使用。我不知道“不再有选项散列可供我使用”是什么意思。请多说。毕竟,您可以简单地将其分配给一个实例变量,然后就可以开始了。除了原始问题中描述的选项之外,您希望对其他选项做什么?