2

레일 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

레일과 관련된 문제는 질문 작성자가 작성합니다. 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 

이 기능이 작동하는지 알려주세요.