2016-06-23 8 views
2

Ich habe ein Hash-Feld in meinem Rails-Modell und versuche, es zu aktualisieren. Das Attribut detail wurde zuerst durch eine Migration als text Typ generiert. Nachwort, in meinem Modell, wurde es als hash durch die store :detail EigenschaftNicht erlaubte Parameter mit Hashes in Rails

class Request < ActiveRecord::Base 
    store :detail 
end 

Meine strong_params sind als solche:

params.require(:request).permit(:name, :action, :detail => {}) 

Wenn jedoch meine Parameter durchlaufen als

Parameters: {"request"=>{"name"=>"temp", "action"=>"create", "detail"=>{"test"=>"fdsf"}}} 

Mir wurde gesagt, dass es eine Unpermitted parameter: test, trotz der test Parameter ist Teil der detail Hash.

Wie behebe ich das? Vielen Dank!

Antwort

3
params.require(:request).permit(:name, :action, detail: [:test]) 

Eine weitere Option (z. B.., Wenn Sie die möglichen Feldnamen im Voraus nicht kennen) wäre die detail zu JSON-String auf Client-Seite serialisiert werden, akzeptieren sie als String und deserialisieren danach auf einen Hash.

0

Das (eher alt) issue Tackles Ihr Problem ganz interessant

Unter Berücksichtigung Ihrer Hash von mehreren Werten besteht als :test Sie die Lösung mit .tap

params.require(:request).permit(:name, :action).tap do |whitelisted| 
    whitelisted[:detail] = params[:request][:detail] 
end 

Oder die etwas weniger dynamisch versuchen könnte:

params.require(:request).permit(:name, :action, :detail => [:test]) 

Diese blogpost fasst verschiedene Ansätze zusammen s.

bearbeiten

Sie benötigen detail Spalte vom Typ ‚Text‘ sein, um den Hash als Zeichenfolge zu speichern. In Ihrem Request Modell fügen Sie diese nach oben:

serialize :detail 

, da sie die Zeichenfolge :detail als Hash

+0

ich tun, um Ihre Whitelist-Lösung versucht interpretieren können und das gleiche Problem tauchte ... es scheint bevorzugt aber mit wie ich nicht alle Werte auflisten muss. – uccblack

+0

Haben Sie den 'Bearbeiten' Teil meiner Antwort überprüft? ;) Wie der Wert in der DB gespeichert wird, wird nicht von den Parametern übernommen, die Sie für Ihr Objekt zulassen. –

Verwandte Themen