Ruby on rails rails中默认的getter和setter是什么样子的?

Ruby on rails rails中默认的getter和setter是什么样子的?,ruby-on-rails,ruby,ruby-on-rails-3,virtual-attribute,attr-accessor,Ruby On Rails,Ruby,Ruby On Rails 3,Virtual Attribute,Attr Accessor,我知道我可以编写attr\u accessor:tag\u list来为Rails中的对象创建虚拟属性tag\u列表。这允许在对象的表单中存在标记列表属性 如果我使用attr_accessor:tag_list,我可以在模型中对tag_list执行操作,从表单中提取和操作数据 我想知道的是,与其编写attr_访问器,不如编写一个完全复制attr_访问器默认功能的getter和setter。例如: def tag_list #what goes here end 仅供参考,我已经试过了

我知道我可以编写attr\u accessor:tag\u list来为Rails中的对象创建虚拟属性tag\u列表。这允许在对象的表单中存在标记列表属性

如果我使用attr_accessor:tag_list,我可以在模型中对tag_list执行操作,从表单中提取和操作数据

我想知道的是,与其编写attr_访问器,不如编写一个完全复制attr_访问器默认功能的getter和setter。例如:

def tag_list
    #what goes here
end
仅供参考,我已经试过了

 def tag_list
     @tag_list
 end
这是行不通的

是一个内置的Ruby方法,在ActiveRecord上下文中没有特殊意义<代码>属性访问器:标记列表基本上等同于此代码:

# getter
def tag_list
  @tag_list
end

# setter
def tag_list=(val)
  @tag_list = val
end
然而,在ActiveRecord模型中,您可能需要以下内容:

def tag_list
  self[:tag_list]
end

def tag_list=(val)
  self[:tag_list] = val
end
有一点不同:对于第一种方法,
obj[:tag\u list]
不使用与getter和setter相同的存储。对于后者,它确实如此

对getter/setter概念的解释 在Ruby中,以下两行代码是等效的

thing.blabla
thing.blabla()
两者都调用对象的方法
blabla
,并计算到该方法中计算的最后一个表达式。这意味着,对于上述getter方法,您也不需要使用
return
语句,因为该方法只返回方法中的最后一个表达式(
@tag\u list
,实例变量的值)

此外,这两行代码是等效的:

thing.blabla=("abc")
thing.blabla = "abc"
两者都调用对象的方法
blabla=
。带有
=
字符的特殊名称可以像任何其他方法名称一样使用

属性(有时被调用)实际上是普通方法,您还可以在返回或接受它们之前使用一些对值进行转换的特殊逻辑。例如:

def price_in_dollar
  @price_in_euro * 0.78597815
end

def price_in_dollar=(val)
  @price_in_euro = val / 0.78597815
end

使用ActiveRecord时,这是等效的getter和setter版本:

def tag_list
  read_attribute(:tag_list)
end

def tag_list=(val)
  write_attribute(:tag_list, val)
end

这就是你想要的吗?

我在setter中为参数写什么重要吗?或者只是def tag_list=(随便什么)@tag_list=无论什么;结束?杰伊:不,没关系。而且,这不是Rails特有的,它是Ruby的东西。我编辑了你的问题以反映这一点。@jay:我更新了答案,添加了一些额外的信息,说明了为什么这样做。niklas,如果我不清楚的话,很抱歉-我真的需要在rails环境下这样做。这是一个正在提交的html表单,我无法从属性标记列表中检索值。这个答案行不通。。我真的很想让tag_列表接受params[:object][:tag_列表]我认为您的编辑是正确的。。。但我仍然无法从模型中的其他方法访问section_列表。rails attr_访问器是否可能缺少其他设置?下面的答案是正确的def tag_list是访问器,它必须返回一个tag_list,所以返回@tag_list。由于ruby总是返回最后一条语句,您可以跳过返回,只需说\@tag\u list返回\@tag\u list。您找到解决方案了吗?我有一个类似的问题,我的二传手从来没有被解雇过。是的-这是一种,我很确定这是一种方式的一部分。。它几乎可以正常工作,只是出于某种原因,在我的模型中,其他方法仍然无法访问标记列表。attr\u accessor还做了什么,但这里没有?您正在做
tag\u list=which
?因为如果是这样,您不是在调用setter,而是在初始化一个局部变量。相反,您将执行
self.tag\u list=which
。或者,如果您很难让它从表单中读取值,请检查您是否通过不将其添加到
attr\u accessible…
列表来阻止其批量赋值。注意,我在minitest中遇到了一个问题,在使用这样定义的setter方法时,我会遇到“无法写入未知属性…”错误(使用
write_属性
)。当我刚刚将setter切换到设置以虚拟属性命名的实例变量时,测试和我的web应用程序都运行良好。
Notice the code below is in the [Helpers] path. Helpers are now included for                            
all [Controllers] to work from when instantiated.

module SettergettersHelper

#TODO Wayne 
mattr_accessor :nameport
#TODO Wayne Mattingly the code below was replaced BY ABOVE 
#TODO and not depricatable RAILS 4.2.3

# def nameport
#   @nameport 
# end

# def nameport=(nameport)
#   @nameport = nameport 
#end
end

*Getter from Accounts Controller:*
def index
   @portfolio_name = nameport     
end
*Setter from Portfolio Controller:*
def show
    @portfolio_name = @portfolio_name.portfolio_name #from database call
    SettergettersHelper.nameport =  @portfolio_name # set attribute
end