【发布时间】:2015-08-02 14:15:31
【问题描述】:
我有一个输入转账的表格。此传输存储在数据库中(并用于控制器中的事务)。
它工作得差不多了,但现在为了微调输入需要在我保存或进行交易之前进行修改。
- 收件人的姓名需要转换为此用户 ID。
- 金额有两位小数输入,应通过将其乘以一百并使其成为整数来修改为美分。如您所知,银行需要一个坚实的整数基础。
我认为这可行:
转移模型
#transfer.rb
has_one :sender,
:class_name => "User",
:foreign_key => "sender_id"
has_one :recipient,
:class_name => "User",
:foreign_key => "recipient_id"
validates :sender_id, presence: true
validates :recipient_id, presence: true
validates :amount, numericality: {:greater_than => 0}
before_validation :recipient_name_to_id
before_validation :amount_to_cents
def recipient_name_to_id
recipient = User.find_by_user_name(self.recipient_id)
self.recipient_id = recipient.id
end
def amount_to_cents
cents = self.amount
cents = cents*100
cents.to_i
self.amount = cents
end
在应用程序要求输入姓名和任何数字时,修改 :recipient_id 和 :amount 从表单中获取。
它不起作用,因为在交易中它找不到收款人bankaldo。
TransfersController#create 中的 NoMethodError
nil:NilClass 的未定义方法 `cents'
@account_b.cents += @transfer.amount
其他一切正常。我彻底检查过了。
但也许添加控制器会有所帮助
TransfersController
def create
@user = User.find(params[:user_id])
#transfer
@transfer = Transfer.new(transfer_params)
@transfer.sender_id = @user.id
#transactie tussen accounts
@account_a = @user.account
@account_b = Account.find_by_user_id(@transfer.recipient_id)
if @account_a != @account_b
if @account_a.cents >= @transfer.amount
Account.transaction do
@account_a.cents -= @transfer.amount
@account_a.save!
@account_b.cents += @transfer.amount
@account_b.save!
@transfer.save!
flash.notice = "Uw opdracht is verzonden."
end
else
flash.notice = "U beschikt niet over voldoende saldo om uw opdracht te doen slagen."
end
else
flash.notice = "U kunt geen geld overmaken naar uw eigen account."
end
redirect_to user_path(@user)
end
private
def transfer_params
params.require(:transfer).permit(:sender_id, :recipient_id, :amount)
end
更新
我现在正在使用当前设置(这是更聪明,还是真的不重要?)。
#same transfer.rb model but now with this as non private methods.
def recipient_id=(value)
user = User.find_by_user_name(value)
self[:recipient_id] = user.id
end
def amount=(value)
cents = value * 100
cents.to_i
self[:amount] = cents
end
代码现在给出:
验证失败:金额不是数字
不能@transfer.save!在控制器中。
更新 2
好吧,它几乎可以工作。我必须先通过 to_f 将值变成浮点数。然后它起作用了......直到我再次打开验证(我注释掉了),现在它给出了一个错误,即数量不是整数......我在def中声明。 Hmprff :S
更新 3
现在一切正常。我的方法现在看起来像这样:
def recipient_id=(value)
user = User.find_by_user_name(value)
self[:recipient_id] = user.id
end
def amount=(value)
cents = value.to_f * 100
self[:amount] = cents.to_i
end
它的坏处是,如果应用程序提供了错误的表单信息,它会显示验证错误屏幕,而我希望它发出通知并将其重定向到它所在的显示窗口。
我上面在transfermodel中定义的这些方法中找不到flash和redirect两种方法。
【问题讨论】:
-
您最多有 5 个不同的问题,这会将您的问题标记为不清楚或过于宽泛。是时候ask a new question了。如果它有助于提供上下文,请链接回这个。
标签: ruby-on-rails forms ruby-on-rails-4