2013-08-27 13 views
6

Tak więc nie wydaje się, aby istniał jakikolwiek czysty sposób na ogólne zezwolenie na pole Hash o silnych parametrach. To oczywiście może być silny problem z parametrami, ale jestem ciekawy, czy istnieje obejście. Mam model z niektórych dziedzinach ...Dynamiczne pole mieszające w Mongoid przy użyciu mocnych parametrów

field :name, type: String 
field :email, type: String 
field :other_stuff, type: Hash, default: {} 

Teraz mogę tylko zezwolić wszystko:

params.require(:registration).permit! 

Ale nie jest to naprawdę świetny pomysł i co chciałabym robić coś jak ...

params.require (: rejestracja) .permit (: nazwa: e-mail, {other_stuff: {}})

jednak to nie wydają się być możliwe z silnymi parametrów, nieprawdaż nie można po prostu skasować t hash jako właściwość (yy dla SQL centric ActiveRecord API!). Wszelkie pomysły, jak to zrobić, lub najlepiej jak zechcesz przesłać łatę Railsów, aby uwzględnić ten scenariusz.

Odpowiedz

8

Ok, po zbadaniu tego, znalazłem eleganckie rozwiązanie, że zacznę używając zbyt:

params.require(:registration).permit(:name).tap do |whitelisted| 
    whitelisted[:other_stuff] = params[:registration][:other_stuff] 
end 

źródło: https://github.com/rails/rails/issues/9454#issuecomment-14167664

+0

Eeeeewwww. Ale masz rację, wydaje się, że jest to sposób, w jaki ma być traktowany. –

0

razie potrzeby zagnieżdżonych atrybuty mogą być również dozwolone w następujący sposób:

def create_params 
    params[:book]["chapter"].permit(:content) 
end 
0

W przypadku pola, które umożliwia zagnieżdżanie skrótów, używam następującego rozwiązania:

def permit_recursive_params(params) 
    params.map do |key, value| 
    if value.is_a?(Array) 
     { key => [ permit_recursive_params(value.first) ] } 
    elsif value.is_a?(Hash) || value.is_a?(ActionController::Parameters) 
     { key => permit_recursive_params(value) } 
    else 
     key 
    end 
    end 
end 

aby ją zastosować na przykład values param, można go używać tak:

def item_params 
    params.require(:item).permit(values: permit_recursive_params(params[:item][:values])) 
end 
Powiązane problemy