簡體   English   中英

如何允許正確存儲序列化數組?

[英]How to permit the proper storage of serialized arrays?

我正在使用Rails 4.0.0,並且試圖將一個序列化數組正確存儲到數據庫中,以允許使用StrongParameters gem值。 也就是說,我有:

# Model class
class Article < ActiveRecord::Base
  serialize :links, Array

  ...
end

# Controller class
class ArticlesController < ApplicationController
  ...

  def update
    ...
    @article.update_attributes(article_params)
    ...
  end


  private

  def article_params
    params.require(:article).permit(<PERMITTED_PARAMETERS>) # Keep reading for more information.
  end
end

從視圖中提交的參數為:

"links"=>{"0"=>{"name"=>"Web Site Name 0", "url"=>"www.website0.com"}, "1"=>{"name"=>"Web Site Name 1", "url"=>"www.website1.com"}, "2"=>{"name"=>"Web Site Name 2", "url"=>"www.website2.com"}, "3"=>{"name"=>"", "url"=>""}, "4"=>{"name"=>"", "url"=>""}, "5"=>{"name"=>"", "url"=>""}}}

在上面的代碼中,我嘗試依次放置以下內容代替<PERMITTED_PARAMETERS>

:links => [:name, :url]
[:links => [:name, :url]]
{:links => [:name, :url]}
[{:links => [:name, :url]}]

在上述所有情況下,StrongParameters正確地允許值而不會引發錯誤,但是在我的數據庫中,它始終存儲以下序列化數據:

---
- !ruby/hash:ActionController::Parameters
  name: Web Site Name 0
  url: www.website0.com
- !ruby/hash:ActionController::Parameters
  name: Web Site Name 1
  url: www.website1.com
- !ruby/hash:ActionController::Parameters
  name: Web Site Name 3
  url: www.website2.com

!ruby/hash:ActionController::Parameters是什么意思? 這是正確的嗎? 如果沒有,我該如何正確存儲數據? 是StrongParameters寶石導致這種奇怪的行為嗎?

注意 :即使數據“奇怪”,所有內容似乎都可以在我的系統中工作。

我更喜歡使用自定義編碼器,看看

# Model class
class Article < ActiveRecord::Base
  serialize :links, ArticleCoder

  ...
end

還有...

class ArticleCoder
  def self.load(data)
    YAML.load(data) unless data.nil?
  end
  def self.dump(data)
    YAML.dump(data.to_a) unless data.nil?
  end
end

讓我知道這是否適合您。

如果未定義ActionController :: Parameters時將數據加載到rails之外,則可能會導致問題。 除此之外,這意味着您將獲得一個ActionController :: Parameters對象而不是Hash。 由於它們的行為方式相同,因此可以類似地使用它們。

現在,如果仍然需要哈希,則應該能夠在模型中執行以下操作:

before_save :serialize_to_hash
def serialize_to_hash
  self.links = self.links.to_hash
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM