Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 更改嵌套键名称_Ruby On Rails_Ruby_Nested_Key_Rename - Fatal编程技术网

Ruby on rails 更改嵌套键名称

Ruby on rails 更改嵌套键名称,ruby-on-rails,ruby,nested,key,rename,Ruby On Rails,Ruby,Nested,Key,Rename,我试图避免在接收JSON的控制器中与Rails保留名称发生冲突 守则: class TransactionsController < ApplicationController #before_action :set_origin_transaction, only: [:show, :edit, :update, :destroy] skip_before_action :verify_authenticity_token, :only => [:create] def cre

我试图避免在接收JSON的控制器中与Rails保留名称发生冲突

守则:

class TransactionsController < ApplicationController

#before_action :set_origin_transaction, only: [:show, :edit, :update, :destroy]
skip_before_action :verify_authenticity_token, :only => [:create]

def create

    total = origin_transaction_params[:total]
    outputs_value = origin_transaction_params[:origin_inputs_attributes][:output_value]
    binding.pry
    origin_inputs_addresses = origin_transaction_params[:origin_inputs_attributes][:addresses]
    origin_outputs_value = origin_transaction_params[:origin_outputs_attributes][:output_value]
    origin_outputs_addresses = origin_transaction_params[:origin_outputs_attributes][:addresses]
    puts "total: " + total + "outputs_value: " + origin_outputs_value + "inputs_addresses: " + origin_inputs_addresses 
    puts "outputs_value: " + origin_outputs_value + "outputs_addresses: " + origin_outputs_addresses

end


# This is made to avoid using reserved names of ruby (transaction, inputs, outputs, etc), we change the keys
private
    def origin_transaction_params
  params.deep_transform_keys! { |key| key == "hash" ? "origin_hash" : ( key == "inputs" ? "origin_inputs_attributes" : ( key == "outputs" ? "origin_outputs_attributes" : ( key == "addresses" ? "btcaddresses" : key))) }
  params.permit(
    :block_height, 
    :block_index, 
    :origin_hash, 
    :total, 
    :fees, 
    :size, 
    :preference, 
    :relayed_by, 
    :received, 
    :ver, 
    :lock_time, 
    :double_spend, 
    :vin_sz, 
    :vout_sz, :confirmations,
    :origin_inputs_attributes => [ :prev_hash, :output_index, :script, :output_value, :sequence, :btcaddresses, :script_type ],
    :origin_outputs_attributes => [ :value, :script, :btcaddresses, :script_type ])
    end
我还想停止使用不推荐使用的方法

更新

正如@Glyoko所建议的,删除了很多错误的东西:

class TransactionsController < ApplicationController
skip_before_action :verify_authenticity_token, :only => [:create]

def create

    total = transaction_params[:total]
    binding.pry #debugging
    render status: :created
end

private
    def transaction_params
  params.permit(
    :block_height, :block_index, :hash, 
    :addresses[], #### LINE 15 ERROR
    :total, :fees, :size, :preference, :relayed_by, :received, 
    :ver, :lock_time, :double_spend, :vin_sz, :vout_sz, :confirmations,
    :inputs => [ :prev_hash, :output_index, :script, :output_value, :sequence, :addresses[], :script_type],
    :outputs => [ :value, :script, :addresses [], :script_type ])
    end
class TransactionController[:create]
def创建
总计=事务参数[:总计]
binding.pry#调试
呈现状态::已创建
终止
私有的
def事务参数
许可证(
:块高度,:块索引,:散列,
:地址[],#####第15行错误
:总计,:费用,:大小,:首选项,:中继人,:接收,
:ver,:lock_time,:double_spend,:vin_sz,:vout_sz,:confirmations,
:inputs=>[:prev_hash,:output_index,:script,:output_value,:sequence,:addresses[],:script_type],
:outputs=>[:value,:script,:addresses[],:script\u type])
终止
结束

错误:

在1ms内完成500个内部服务器错误(ActiveRecord:0.0ms)

ArgumentError(参数数目错误(给定0,应为1..2)):

app/controllers/transactions\u controller.rb:15:in
[]
app/controllers/transactions\u controller.rb:15:in
transaction\u params' app/controllers/transactions\u controller.rb:6:in'create'


请注意,地址可能有一个或多个地址

我不认为这里有任何与保留关键字相关的问题,尽管我看到至少有4个问题:

1) 第9行的打字错误

2) 弃用警告

3) 未经允许的参数警告,以及

4) 500错误

tl;dr是
params.deep\u transform\u键
出于所有错误的原因正在使用一些严重的黑暗魔法,您可能应该删除该行并重新考虑您的方法。那
深沉的变换\u键
肯定是(2)和(3)的原因,也可能是(1)的原因。更详细的答案,按照我列出的顺序:

1) 第9行的TypeError来自
origin\u事务参数[:origin\u inputs\u attributes][:output\u value]
origin\u transaction\u params[:origin\u inputs\u attributes]
返回某种非散列对象,这意味着您调用的是
某个非散列的东西[:output\u value]
,这会产生类型错误。您可以在控制器中为此添加保护,但这可能反映了数据结构的更深层次的问题。(JSON负载是什么样子的?)

2) 从Rails 4开始,
params
现在是ActionController::Parameters的一个实例
params
看起来和行为都像一个散列,但实际上它并不是一个真正意义上的散列。这意味着并非所有的散列方法都适用于它。在这种情况下,
deep\u transform\u键现在可以正常工作了,但是正如警告所说,它的实现将在Rails 5.1和
deep\u transform\u键之后发生变化将不再适用于它。如果不取消对
deep\u transform\u键的调用,就无法取消此警告

事实上,强参数的正确用法是仅对作为预期有效负载一部分的密钥名调用permit。也就是说,只允许对作为未更改JSON负载一部分的键名进行调用。这可能意味着您实际上应该去掉
deep\u transform\u键,因为使用它来更改参数哈希是不正确的用法

在任何情况下,“transaction”、“inputs”和“outputs”在ruby中都不是保留关键字,即使它们是保留关键字,只要它们被引用,也不会阻止它们成为散列中的键

3) 深_变换_键!行正在创建一个名为“BTCADRESS”的根级别键。它不仅在origin\u inputs\u attributes/origin\u outputs\u attributes内部,所以它需要在根目录下被允许。同样,只有在保留深_变换_键的情况下才需要此选项!线你可能真的想摆脱它

4) 500错误来自(1),因此,一旦修复了它,这将得到解决,尽管如果视图设置不正确,您仍然可能会遇到500错误。如果发生这种情况,请尝试添加以下内容

render status::created

,并确保您的视图/目录中有一个创建模板。

代码现在正在工作,它仍然在说“unpermittedparameter:transaction”,但它正在打印我需要的内容。我搜索了JSON,没有一个单词命名为transaction,代码中也有同样的东西:

class TransactionsController < ApplicationController
skip_before_action :verify_authenticity_token, :only => [:create]

def create

    amount = btcTx_params[:total]
    btcAddresses = btcTx_params[:outputs][0][:addresses]
    confirmations = btcTx_params[:confirmations]
    double_spend = btcTx_params[:double_spend]
    puts "Bitcoin Addresses = #{btcAddresses}"
    puts "Amount = #{amount}"
    puts "Confirmations = #{confirmations}"
    puts "Is double spend? = #{double_spend}"
    #binding.pry #debugging
    render status: :created
end

private
    def btcTx_params
  params.permit(
    :block_height, :block_index, :hash, 
    :total, :fees, :size, :preference, :relayed_by, :received, 
    :ver, :lock_time, :double_spend, :vin_sz, :vout_sz, :confirmations,
    :inputs => [ :prev_hash, :output_index, :script, :output_value, :sequence, :script_type, :addresses => [] ],
    :outputs => [ :value, :script, :script_type, :addresses => [] ],
    :addresses => [])
    end
}

不允许的参数:事务 不允许的参数:事务 不允许的参数:事务 未允许的参数:交易

放 比特币地址=[“191JF8jDaCCADJsjrx171fd6PE6D9YtGoi”]

金额=183092

确认=0

是双倍消费吗假的

在布局/应用程序中呈现事务/create.html.erb 布局/应用程序中的渲染事务/create.html.erb(0.6ms) 在41ms内创建完成201(视图:28.5ms |活动记录:0.0ms)

但这是一个极大的进步。 非常感谢,伙计们,

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

class TransactionsController < ApplicationController
skip_before_action :verify_authenticity_token, :only => [:create]

def create

    amount = btcTx_params[:total]
    btcAddresses = btcTx_params[:outputs][0][:addresses]
    confirmations = btcTx_params[:confirmations]
    double_spend = btcTx_params[:double_spend]
    puts "Bitcoin Addresses = #{btcAddresses}"
    puts "Amount = #{amount}"
    puts "Confirmations = #{confirmations}"
    puts "Is double spend? = #{double_spend}"
    #binding.pry
    #binding.pry #debugging
    render status: :created
end

private
    def btcTx_params
  params.require(:transaction).permit(
    :block_height, :block_index, :hash, 
    :total, :fees, :size, :preference, :relayed_by, :received, 
    :ver, :lock_time, :double_spend, :vin_sz, :vout_sz, :confirmations,
    :inputs => [ :prev_hash, :output_index, :script, :output_value, :sequence, :script_type, :addresses => [] ],
    :outputs => [ :value, :script, :script_type, :addresses => [] ],
    :addresses => [])
    end
class TransactionController[:create]
def创建
金额=btcTx_参数[:总计]
BTCADRESS=btcTx_参数[:输出][0][:地址]
确认=btcTx_参数[:确认]
双倍支出=btcTx参数[:双倍支出]
放入“比特币地址=#{BTCADRESS}”
放入“金额=#{Amount}”
放置“确认=#{Confirmations}”
放入“是双倍消费吗?={double_-spend}”
#捆绑,撬动
#binding.pry#调试
呈现状态::已创建
终止
私有的
def btcTx_参数
参数require(:事务处理).permit(
:块高度,:块索引,:散列,
:总计,:费用,:大小,:首选项,:中继人,:接收,
:ver,:锁定时间,:加倍花费,:vi
"block_height":-1,
"block_index":-1,
"hash":"4f14eb3517c92221892d7b86b4e691de404dddecbcc5d6d03148de8b1a6aceb8",
"addresses":[
    "12onkFjRFBdmgAMW5fapaGfo8E2PWxNRbb",
    "191JF8jDaCCADJsjrx171fd6PE6D9YtGoi",
    "1MGHXDQAA4mfBSLK4Dt3QDrAXNcXaaW7JY",
    "1PZCBuJC53HwjVhXb5B1rA4uFhrHrqrUUC"
],
"total":183092,
"fees":33660,
"size":372,
"preference":"high",
"relayed_by":"67.205.175.175:8333",
"received":"2017-01-02T00:59:06.751Z",
"ver":1,
"lock_time":0,
"double_spend":false,
"vin_sz":2,
"vout_sz":2,
"confirmations":0,
"inputs":[
    {
        "prev_hash":"dcb03a8c3dc38e28376b5b97479b06c383813c3fc5bcc66fb59c4967b85436c3",
        "output_index":1,
        "script":"47304402205c1cdd0cf3f789375a6dfc0c76eba142724edda2473b235547b7275f7dd0f1c4022046ec4f0be0726d848f6ccd1467b04023897e4575988115c0ac8dbaf569fe03da012102a6237f2117e38d566581452171cff013cfee6f69d5af84fab2214350882a81d9",
        "output_value":108376,
        "sequence":4294967295,
        "addresses":[
            "12onkFjRFBdmgAMW5fapaGfo8E2PWxNRbb"
        ],
        "script_type":"pay-to-pubkey-hash"
    },
    {
        "prev_hash":"9609e8f8a18a11ce54f2b726df5cee24e4589a03feef9b121be5a2eb4ce27ce0",
        "output_index":1,
        "script":"47304402207a29300f3570b5d635b344e3fdc38b3906cb7712870a4a775b4a10cb000b0b6202207ffbd30d0ad0cafb1e93253b17ab302583816c8e17d9d15114c544a6614c9e3201210314fd8f972f8d3e840dfeee629dc5bdcb81c272334c6b23ff34ccd5cbc761fadd",
        "output_value":108376,
        "sequence":4294967295,
        "addresses":[
            "1PZCBuJC53HwjVhXb5B1rA4uFhrHrqrUUC"
        ],
        "script_type":"pay-to-pubkey-hash"
    }
],
"outputs":[
    {
        "value":82592,
        "script":"76a91457cf668b86c09b50e1fe89fac148ba321380d54588ac",
        "addresses":[
            "191JF8jDaCCADJsjrx171fd6PE6D9YtGoi"
        ],
        "script_type":"pay-to-pubkey-hash"
    },
    {
        "value":100500,
        "script":"76a914de468bcbc3c1bf0e25dd9b626c60eac3a8d8d91488ac",
        "addresses":[
            "1MGHXDQAA4mfBSLK4Dt3QDrAXNcXaaW7JY"
        ],
        "script_type":"pay-to-pubkey-hash"
    }
]
class TransactionsController < ApplicationController
skip_before_action :verify_authenticity_token, :only => [:create]

def create

    amount = btcTx_params[:total]
    btcAddresses = btcTx_params[:outputs][0][:addresses]
    confirmations = btcTx_params[:confirmations]
    double_spend = btcTx_params[:double_spend]
    puts "Bitcoin Addresses = #{btcAddresses}"
    puts "Amount = #{amount}"
    puts "Confirmations = #{confirmations}"
    puts "Is double spend? = #{double_spend}"
    #binding.pry
    #binding.pry #debugging
    render status: :created
end

private
    def btcTx_params
  params.require(:transaction).permit(
    :block_height, :block_index, :hash, 
    :total, :fees, :size, :preference, :relayed_by, :received, 
    :ver, :lock_time, :double_spend, :vin_sz, :vout_sz, :confirmations,
    :inputs => [ :prev_hash, :output_index, :script, :output_value, :sequence, :script_type, :addresses => [] ],
    :outputs => [ :value, :script, :script_type, :addresses => [] ],
    :addresses => [])
    end