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