Ruby on rails 4 Rails 4-通过深度嵌套的参数循环,以防止将密码字段更新为空

Ruby on rails 4 Rails 4-通过深度嵌套的参数循环,以防止将密码字段更新为空,ruby-on-rails-4,controller,nested-attributes,params,Ruby On Rails 4,Controller,Nested Attributes,Params,在编辑表单中,现有密码在表单中显示为空白,这似乎是Rails的默认行为。但是,我试图避免在未输入新密码的情况下将密码或在我的情况下将密码更新为空白,类似于此处所述: 对我来说,不同之处在于密码字段嵌套得更深,而且不止一个 基本上,我有一个小型银行转账应用程序,其中每个:转账都有两个:转账账户,源和目标转账账户是一个多账户,通过转账和账户的联接表,两个转账账户都有一个:账户和一个:密码属性 在更新操作的顶部,我的尝试是这样的: params[:transfer][:transfer_account

在编辑表单中,现有密码在表单中显示为空白,这似乎是Rails的默认行为。但是,我试图避免在未输入新密码的情况下将密码或在我的情况下将密码更新为空白,类似于此处所述:

对我来说,不同之处在于密码字段嵌套得更深,而且不止一个

基本上,我有一个小型银行转账应用程序,其中每个:转账都有两个:转账账户,源和目标转账账户是一个多账户,通过转账和账户的联接表,两个转账账户都有一个:账户和一个:密码属性

在更新操作的顶部,我的尝试是这样的:

params[:transfer][:transfer_accounts_attributes].each do |k, v|
  v[:account_attributes][:password].delete if v[:account_attributes][:password].empty?
end  
这没用。保留为空的任一密码都将更新为空

如果密码保留为空,我如何遍历参数并防止其中一个或两个密码更新

这是我的控制器:

class TransfersController < ApplicationController

  def new
    @transfer = Transfer.new
    @transfer.transfer_accounts.build(account_transfer_role: 'source').build_account
    @transfer.transfer_accounts.build(account_transfer_role: 'destination').build_account
    @valid_banks = Bank.all.collect {|c| [c.name, c.id]}  # available banks seeded in database
  end

  def index
    @transfers = Transfer.all
  end

  def show
    @transfer = resource
  end

  def create
    @transfer = Transfer.new(transfer_params)
    if @transfer.save
      redirect_to transfers_path, notice: "Transfer Created"
    else
      redirect_to transfers_path, alert:  "Transfer Not Created"
    end
  end

  def edit
    resource
    @valid_banks = Bank.all.collect {|c| [c.name, c.id]}  # available banks seeded in database
  end

  def update
    if resource.update_attributes(transfer_params)
      redirect_to transfers_path(resource),     notice: "Transfer Updated"
    else
      redirect_to edit_transfer_path(resource), alert:  "Transfer Not Updated"
    end
  end

  def destroy
    resource.destroy
  end


  private

  def resource
    @transfer ||= Transfer.find(params[:id])
  end

  def transfer_params
    params.require(:transfer).
      permit(:name, :description,
             transfer_accounts_attributes:
               [:id, :account_transfer_role,
                account_attributes:
                  [:id, :bank_id, :name, :description, :user_name,
                   :password, :routing_number, :account_number
                  ]
               ])
  end

end

您必须调用hash.delete,而不是删除已经为空的值的内容。还有,空白?是您的朋友,因为这将处理nil和==。

您可以为请求显示参数哈希的内容吗?另外,尝试使用blank?而不是空的?看看这有什么不同?v[:帐户属性][:密码].空白?我用的是空白?键:0,值:{account\u transfer\u role=>source,account\u attributes=>{bank\u id=>2,name=>Joe's Checking,description=>Joe's personal Checking account,user\u name=>joechk,password=>change,account\u number=>123456789,routing\u number=>1122334455,id=>1},id=>1}键:1,值:{account_transfer_role=>destination,account_attributes=>3,name=>Joe's Savings,description=>Joe's personal Savings account,user_name=>joesav,password=>change,account_number=>098765432,routing_number=>0099887766,id=>2},id=>2}这非常有效!我感觉我在做你描述的事情,删除一个空白值,但我不知道如何正确处理。谢谢,詹姆斯!副总统还没有提升投票的声望
params[:transfer][:transfer_accounts_attributes].each do |k, v|
  v[:account_attributes].delete(:password) if v[:account_attributes][:password].blank?
end