web-dev-qa-db-fra.com

Rails 4 paramètres non autorisés pour le tableau

J'ai un champ de tableau dans mon modèle et j'essaie de le mettre à jour.

Ma méthode de paramètre fort est ci-dessous

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

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

Mon action dans mon contrôleur est la suivante

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

Cependant, chaque fois que je soumets la mise à jour du message, dans mon journal de développement, je vois

Unpermitted parameters: categories

Les paramètres transmis sont

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

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

Je veux penser que cela a quelque chose à voir avec le fait que l'attribut categories est un tableau car tout le reste semble bien. Là encore, je peux me tromper. Alors, quel est le problème avec mon code et pourquoi ne me laisse-t-il pas enregistrer le champ des catégories alors qu'il est clairement autorisé à le faire? Merci.

50
jason328

Essaye ça

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

(Ne tenez pas compte de mon commentaire, je ne pense pas que ce soit important)

131
Slicedpan

dans Rails 4, ce serait,

params.require(:post).permit(:name, :email, {:categories => []})
41
Imtiaz Emu

Les types scalaires autorisés sont String, Symbol, NilClass, Numeric, TrueClass, FalseClass, Date, Time, DateTime, StringIO, IO, ActionDispatch::Http::UploadedFile et Rack::Test::UploadedFile.

Pour déclarer que la valeur dans params doit être un tableau de valeurs scalaires autorisées, mappez la clé sur un tableau vide:

params.permit(:id => [])

C'est ce que dit la documentation des paramètres forts sur Github :

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

J'espère que cela fonctionne pour vous.

8
Mohammad Abu Musa

J'ai eu le même problème, mais simplement ajouter un tableau pour permettre n'était pas suffisant. J'ai aussi dû ajouter du type. Par ici:

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

Je ne suis pas sûr que ce soit la solution parfaite, mais après cela, le journal des "paramètres non autorisés" a disparu.

J'ai trouvé un indice pour cette solution dans cet excellent article: http://patshaughnessy.net/2014/6/16/a-rule-of-thumb-for-strong-parameters

1
Heikki Hannula

J'ai eu le même problème mais dans mon cas j'ai dû aussi changer de:

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

à:

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

J'espère que cela aide quelqu'un.

1
Carlo S