0

有這些關係:我如何動態白名單鍵hstore在嵌套模式

class Applicant < ActiveRecord::Base 
    has_many :answers 
    accepts_nested_attributes_for :answers 
end 

class Answer < ActiveRecord::Base 
    belongs_to :applicant 
end 

答案模型具有稱爲屬性的hstore屬性。屬性哈希將具有動態密鑰,因爲它們是由用戶在應用程序中創建的。

我似乎無法成功將申請人控制器中的這些動態密鑰列入白名單。

這是我目前(不成功)的嘗試。

def applicant_params 
    params.require(:applicant).permit(:answers_attributes: [:question_id, :id]).tap do |whitelisted| 
     whitelisted[:answers_attributes][:properties] = params[:applicant][:answers_attributes][:properties] 
    end 
end 

感謝您的任何幫助。

回答

3

UPD。嘗試使用下面的方法(在單獨的文件進行測試):

@params = ActionController::Parameters.new(
    applicant: {answers_attributes: { 
       "0" => {question_id: 10, id: 110, properties: {a: "b", c: "d"}}, 
       "1" => {question_id: 20, id: 120, properties: {m: "n", o: "p"}} 
}}) 

def applicant_params 
    #properties should be [:a, :c, :m, :o] 
    properties = [] 
    @params[:applicant][:answers_attributes].values.each do |answer| 
    properties |= answer[:properties].keys 
    end 
    @params.require(:applicant).permit(answers_attributes: 
             [:question_id, :id, properties: properties]) 
end 

BTL。與hstores合作有相當不錯的article。還有一些一般的東西在使用hstore in Rails 4

+0

看起來這兩個示例在hstore列中都有可預測的鍵。此應用程序具有動態的用戶定義的密鑰。請讓我知道如果我讀錯了。 – ricsrock

+0

你說得對。提供我的定製解決方案 – Leger

+0

非常感謝! – ricsrock