【问题标题】:Rails transfer form data modification errorRails 传输表单数据修改错误
【发布时间】: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


【解决方案1】:

@account_b 未加载,因为transfer_params[:recipient_id]nil,或者因为不存在具有该 ID 的Account。您可能会考虑切换到Account.where(user_id: @transfer.recipient_id).first! 以便它引发异常,或者您需要检查是否@account_b.nil? 并处理问题。因为@account_a != nil,所以你的逻辑一直持续到你无法访问@account_b.cents

检查您的表单和传入参数以确保存在 params[:transfer][:recipient_id],然后验证用户 ID 是否具有 Account

【讨论】:

  • 我似乎真的被我的验证和号码更改所困扰。它给了我“验证失败:金额不是数字”,当我对此发表评论时,它有效,但 50.50 变为 0.50 美分。所以 def amount=(value) 不起作用......而另一个 def recipient_id=(value) 完美地完成了它的工作。
  • 您应该单独提出新问题,这样这个问题才能简单易懂。查看has_one 而不是自己编写recipient_id=to_i 不会改变你的变量,它会返回一个新的整数。
  • 嗯,现在一切正常,但是当您向表单提供错误信息时,它并不漂亮。该应用程序带有它的验证错误屏幕,这是正确的,但我宁愿向用户发送一个简洁的 Flash 通知。在这些对象模型方法中编写 Flash 通知会产生错误,即我使用了无法找到的方法。当我使用重定向时也是如此。 Flash 通知和重定向在这些方法中不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 2012-12-05
  • 2017-01-05
  • 2010-09-25
  • 2011-10-30
相关资源
最近更新 更多