2013-07-25 6 views
49

Mam pole tablicy w moim modelu i próbuję go zaktualizować.Szyny 4 Nieprawidłowe parametry dla tablicy

Moja silna metoda parametr jest poniżej

def post_params 
    params["post"]["categories"] = params["post"]["categories"].split(",") 

    params.require(:post).permit(:name, :email, :categories) 
end 

Moje działanie w moim kontroler następująco

def update 
    post = Post.find(params[:id] 

    if post and post.update_attributes(post_params) 
    redirect_to root_url 
    else 
    redirect_to posts_url 
    end 
end 

Jednak ilekroć złożyć aktualizację post, w moim dzienniku rozwoju widzę

Unpermitted parameters: categories 

Parametry przekazywane to

Parameters: {"utf8"=>"✓", "authenticity_token"=>"auth token", "id"=>"10", 

"post"=>{"name"=>"Toni Mitchell", "email"=>"[email protected]", "categories"=>",2"}} 

Chcę myśleć, że ma to coś wspólnego z tym, że atrybut categories jest tablicą, ponieważ wszystko inne wygląda dobrze. Z drugiej strony mógłbym się mylić. A więc, co jest nie tak z moim kodem i dlaczego nie pozwala mi zapisać pola kategorii, gdy wyraźnie jest to dozwolone? Dzięki.

+0

To może być ze względu na sposób ustawiania wartości parametru kategorii, IIRC obiekt params nie jest prosta hash, czy próbowałem prostszy przykład? – Slicedpan

Odpowiedz

126

Spróbuj

params.require(:post).permit(:name, :email, :categories => []) 

(Lekceważenie mój komentarz, nie sądzę, że sprawy)

+1

cześć, mam problem Przetarg (# 69846105528920) oczekiwano, dostałem String (# 8248680) – kalelc

+0

Witam, czy istnieje sposób na znalezienie posta w zależności od kategorii w tablicy, przykład 'Post.find_by (tags: 'sports ")'? –

+4

Byłoby miło również wyjaśnić, dlaczego to działa @slicedpan –

8

Dopuszczalne typy skalarne String, Symbol, NilClass, Numeric, TrueClass, FalseClass, Date, Time , DateTime, StringIO, IO, ActionDispatch::Http::UploadedFile i Rack::Test::UploadedFile.

Aby zadeklarować, że wartość w params musi być tablicą dozwolonych wartościach skalarnych map klucz do pustej tablicy:

params.permit(:id => []) 

To właśnie strong parameters documentation on Github mówi:

params.require(:post).permit(:name, :email, :categories => []) 

mam nadzieję to działa dla ciebie.

37

w szynach 4, która byłaby,

params.require(:post).permit(:name, :email, {:categories => []}) 
+4

To działa dla mnie, ale dlaczego musi być w oddzielnym haszymszu, jeśli już zdefiniowaliśmy serializację tego atrybutu w modelu? – barnett

1

miałem ten sam problem, ale w moim przypadku musiałem też zmienić od:

<input type="checkbox" name="photographer[attending]" value="Baku">

do:

<input type="checkbox" name="photographer[attending][]" value="Baku">

Mam nadzieję, że to pomaga omeone.

1

Miałem ten sam problem, ale proste dodanie tablicy do zezwolenia nie było wystarczające. Musiałem również dodać typ. W ten sposób:

params.require(:transaction).permit(:name, :tag_ids => [:id]) 

Nie jestem pewien, czy jest to idealne rozwiązanie, ale po tym, dzienniku „niedozwolonej Parametry” zniknął.

znalazłem wskazówkę do tego roztworu z tej doskonałej postu: http://patshaughnessy.net/2014/6/16/a-rule-of-thumb-for-strong-parameters