Ruby on rails Rails-attr\u accessor:-读取属性值,而不是重写它的函数
我有一个模型Ruby on rails Rails-attr\u accessor:-读取属性值,而不是重写它的函数,ruby-on-rails,activerecord,ruby-on-rails-5,Ruby On Rails,Activerecord,Ruby On Rails 5,我有一个模型客户,它接受一个虚拟属性期初余额。代码如下所示: model Customer < ApplicationRecord attr_accessor :opening_balance has_one :ledger_account after_create :open_ledger_account def opening_balance ledger_account.opening_balance if ledger_account.present?
客户
,它接受一个虚拟属性期初余额
。代码如下所示:
model Customer < ApplicationRecord
attr_accessor :opening_balance
has_one :ledger_account
after_create :open_ledger_account
def opening_balance
ledger_account.opening_balance if ledger_account.present?
end
private
def open_ledger_account
create_ledger_account!(opening_balance: self.opening_balance)
end
但这也不起作用
如何读取存储在实际属性中的值?任何帮助都将不胜感激。我使用的是rails 5.1
谢谢
attr\u accessor
定义实例变量和访问它的方法(读/写)
因此,简单的方法是写:
def open_ledger_account
create_ledger_account!(opening_balance: @opening_balance)
end
只有当
期初余额
是客户
上数据库中的一个属性时,读取属性
才有效 attr\u accessor
定义实例变量和访问它的方法(读/写)
因此,简单的方法是写:
def open_ledger_account
create_ledger_account!(opening_balance: @opening_balance)
end
只有当
期初余额
是客户
上数据库中的一个属性时,读取属性
才有效 首先,您必须了解attr\u accessor
不定义实例变量。它只创建setter和getter方法。attr\u accessor:name
所做的是:
class Person
def name
@name
end
def name=(value)
@name = value
end
end
现在,您可以从外部访问实例变量:
p = Person.new
p.name = 'Jane'
puts p.name
您还可以使用getter方法而不是@name
,从内部访问实例变量:
class Person
attr_accessor :name
def hello
"hello my name is: #{name}"
end
end
attr\u访问器
不“定义”实例变量。Ruby中没有像Java这样的成员/属性声明。实例变量在第一次设置时声明。访问尚未赋值的实例变量将返回nil
那么这里发生了什么:
class Customer < ApplicationRecord
attr_accessor :opening_balance
# ...
def opening_balance
ledger_account.opening_balance if ledger_account.present?
end
end
首先,您必须了解
attr\u accessor
不定义实例变量。它只创建setter和getter方法。attr\u accessor:name
所做的是:
class Person
def name
@name
end
def name=(value)
@name = value
end
end
现在,您可以从外部访问实例变量:
p = Person.new
p.name = 'Jane'
puts p.name
您还可以使用getter方法而不是@name
,从内部访问实例变量:
class Person
attr_accessor :name
def hello
"hello my name is: #{name}"
end
end
attr\u访问器
不“定义”实例变量。Ruby中没有像Java这样的成员/属性声明。实例变量在第一次设置时声明。访问尚未赋值的实例变量将返回nil
那么这里发生了什么:
class Customer < ApplicationRecord
attr_accessor :opening_balance
# ...
def opening_balance
ledger_account.opening_balance if ledger_account.present?
end
end
期初余额
属性在保存之前可用。保存customer对象后,在回调中,它只获取与新创建的customer对象关联的属性。我建议您使用嵌套表单,在自定义模型中,您可以将期初余额
作为嵌套属性获取。期初余额
属性在保存之前可用。保存customer对象后,在回调中,它只获取与新创建的customer对象关联的属性。我建议您使用嵌套表单,在自定义模型中,您可以将期初余额
作为嵌套属性。属性访问器
不定义实例变量。它只是创建一个setter和getter方法。当您第一次为实例变量赋值时,它们都是“已定义”的。因此调用setter方法将“定义”变量。显然是这样,因为在ruby中,没有其他方法“定义”实例变量,然后通过赋值。我的描述有意地简明扼要,以使答案简明扼要。attribute\u accessor
没有定义实例变量。它只是创建一个setter和getter方法。当您第一次为实例变量赋值时,它们都是“已定义”的。因此调用setter方法将“定义”变量。显然是这样,因为在ruby中,没有其他方法“定义”实例变量,然后通过赋值。我的描述有意地简明扼要,以使答案简明扼要。我喜欢代表们的建议。我的猜测是,attr_accessor
之所以存在,是因为在创建新客户时,可以立即以相同的形式输入期初余额。不幸的是,使用代理将破坏该解决方案;但我认为这最终会导致一个更干净的解决方案,例如,让控制者来处理1)新客户的创建,2)分类账账户,而不是让模型来处理。我喜欢代表们的建议。我的猜测是,attr_accessor
之所以存在,是因为在创建新客户时,可以立即以相同的形式输入期初余额。不幸的是,使用代理将破坏该解决方案;但这最终会导致一个更干净的解决方案,例如,让控制者处理1)新客户的创建,2)分类账账户,而不是让模型处理。