【问题标题】:Ruby on Rails - Store params to databaseRuby on Rails - 将参数存储到数据库
【发布时间】:2014-10-27 22:02:46
【问题描述】:

我有来自 POST 请求的这个哈希参数(它是一个 ActionController::Parameters):

{"mc_gross"=>"1.00", "invoice"=>"28", "protection_eligibility"=>"Eligible", "address_status"=>"unconfirmed", "payer_id"=>"FSXBUQDGG6KWN", "tax"=>"0.00", "address_street"=>"Av. de la Pelouse, 87648672 Mayet", "payment_date"=>"14:46:27 Oct 27, 2014 PDT", "payment_status"=>"Completed", "charset"=>"windows-1252", "address_zip"=>"75002", "first_name"=>"St\xE9phane", "mc_fee"=>"0.34", "address_country_code"=>"FR", "address_name"=>"St\xE9phane XXX", "notify_version"=>"3.8", "custom"=>"", "payer_status"=>"verified", "business"=>"stephaneXXXX@gmail.com", "address_country"=>"France", "address_city"=>"Paris", "quantity"=>"1", "verify_sign"=>"AumOxKSV7Re473t76kESkdv3agufAX.VzyW2dEiO-ul3gPNvbfQLzqXq", "payer_email"=>"zXXXXXXX@k.com", "txn_id"=>"8MB257669F3772042", "payment_type"=>"instant", "last_name"=>"XXXX", "address_state"=>"Alsace", "receiver_email"=>"stephaneXXXXXX@gmail.com", "payment_fee"=>"0.34", "receiver_id"=>"ZNER97N82WKY2", "txn_type"=>"web_accept", "item_name"=>"XXXX", "mc_currency"=>"USD", "item_number"=>"1", "residence_country"=>"FR", "test_ipn"=>"1", "handling_amount"=>"0.00", "transaction_subject"=>"", "payment_gross"=>"1.00", "shipping"=>"0.00", "ipn_track_id"=>"5db890c138b56", "controller"=>"purchases", "action"=>"hook"}

我想将它保存在我的数据库中。这样做的最佳方式是什么?

我尝试使用 params.inspect 将其转换为 String 但它不起作用,我也尝试了 serialize(params) 但也失败了。 我的专栏是 t.text,当我按原样执行@purchase.update_attributes my_column: params 时,我收到错误消息:ArgumentError (invalid byte sequence in UTF-8)

谢谢

【问题讨论】:

  • 您打算以后使用这些数据还是仅用于记录目的?
  • @Substantial 用于记录目的

标签: ruby-on-rails ruby hash parameters


【解决方案1】:

在多次尝试都没有成功后,我决定绕过这个问题。 由于数据库字段是一个文本列,我所做的是创建一个包含所有参数的字符串。之后,我能够将我的字符串存储到我的文本字段数据库列中。

parameters = String.new
params.each do |key, value|
  parameters += key + " = " + value + " | "
end

【讨论】:

    【解决方案2】:

    您是否尝试过使用rails serialize

    #in your model
    class Purchase < ActiveRecord::Base
      serialize :my_column
    end
    
    #in controller
    def myaction
      #...
      @purchase.my_column = my_params
      @purchase.save
    end
    

    【讨论】:

    • 谢谢@pavelS,是的,我尝试了你的建议,但收到错误ArgumentError (invalid byte sequence in UTF-8)
    • @ZazOufUmI 请阅读此stackoverflow.com/questions/11375342/… first_nameaddress 导致问题的参数。修复您的编码可能会解决 serialize 的问题
    • 我同意你关于first_name 参数的观点,但我无法控制这些参数(来自用户)。我试过 .encode! 但它返回 NoMethodError (undefined method encode!' for #&lt;ActionController::Parameters:0x000000063f0d58&gt;)Serialize 相同,返回 NoMethodError (undefined method serialize' for #&lt;PurchasesController:0x00000006201c18&gt;)
    • 使用params.map { |x| x.try(:scrub) } 删除字符串中的所有无效字符。它内置在 2.1 中,还有早期版本的 gem。要接受嵌套哈希,您应该实现 deep_map(您可以谷歌搜索它,这是一个选项 ruby-forum.com/topic/218112)。附言serialize 应该在模型中使用,而不是在控制器中。
    【解决方案3】:
    St\xE9phane 中的

    \xE9 是 U+00E9 的 unicode 字符。您需要将其替换为“e”。

    2.1.0 :010 > a="St\xE9phane"
    => "St\xE9phane" 
    2.1.0 :011 > a.scrub!('e')
    => "Stephane"
    

    或者您可以将数据库配置为使用 unicode store unicode in mysql.

    【讨论】:

    • 这是用户输入,所以我无法控制它。我会尽快尝试你的建议!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多