2

我正在使用Rails 4.0.0,我試圖正確地存儲一個序列化數組到數據庫允許值與StrongParameters寶石。也就是說,我有:如何允許正確存儲序列化數組?

# 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寶石?

注意:即使數據是「奇怪」,所有似乎在我的系統中工作。

+0

Rails問題與此問題相關,並由問題提問者創建:https://github.com/rails/rails/issues/12557 –

回答

1

當ActionController :: Parameters未定義時,如果您在軌道之外加載數據,這可能會導致問題。 除此之外,這意味着你得到一個ActionController :: Parameters對象而不是哈希。 由於它們的行爲方式相同,因此可以相似地使用它們。

現在,如果你需要一個哈希無論如何,你應該能夠做你的模型如下:

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

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

# 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 

讓我知道這是否適合你。

相關問題