2012-12-13 13 views
14

This video stwierdza, że ​​możliwe jest zabezpieczenie wejścia przychodzącego przez kontroler, ale nadal możliwe jest przypisanie masy za pomocą modeli i specyfikacji. Jednak nie widziałem tego udokumentowanego jako funkcji podczas używania parametru strong_parameters w wersji 3.2.8.Silne parametry w szynach 3.2.8

Rozumiem, że muszę wymieszać w ActiveModel::ForbiddenAttributesProtection w moich modelach i ustawić config.active_record.whitelist_attributes = false w config/application.rb. Wyciągnąłem również wszystkie moje wywołania attr_accessible z modelu.

Z mieszaniem lub bez niego otrzymuję błędy przydziału masy.

ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes: home_phone, cell_phone

Am I czegoś brakuje?

+2

Jeśli użyjesz 'attr_protected: home_phone,: cell_phone', to nie będą mogli przypisywać mas. – VenkatK

+1

Niestety, nie mam również 'attr_protected' w moim modelu. Ale dostaję tego samego błędu. –

+0

@ brandon-hansen - widziałeś relację Ryana Batesa na ten temat? http://railscasts.com/episodes/371-strong-parameters?view=asciicast – simonmorley

Odpowiedz

19

Sugerowana RailsCast jest chyba dobry start, ale tutaj jest podsumowanie tego, co trzeba zrobić, aby dostać w Rails3.x silne parametrów pracy zamiast attr_accessible:

  1. Dodaj gem 'strong_parameters' do Gemfile i uruchomić pakiet.

  2. Komentarz out (lub wartość false) config.active_record.whitelist_attributes = true w config/environment.rb

  3. Mix w ActiveModel::ForbiddenAttributesProtection w modelu (The railscast proponuje w tym celu w nowej initializer, config/inicjalizatorów/strong_parameters. rb ActiveRecord::Base.send(:include, ActiveModel::ForbiddenAttributesProtection))

  4. Od teraz będziesz musiał użyć składni, takich jak ten:

    model_params = params[:model].permit(:attribute, :another_attribute) 
    @model.update_attributes(model_params) 
    

    po aktualizacji modeli. W takim przypadku dowolny atrybut w params[:model] oprócz :attribute i :another_attribute spowoduje błąd ActiveModel :: ForbiddenAttributes.

Można również użyć resztę nowej magii z ActionController::Parameters, takich jak .require(:attribute) zmusić obecność atrybutu.

+0

Nadal działa, to powinno być akceptowane. –

2

To nie jest to samo, co Twój problem, ale może pojawić się ktoś inny otrzymujący MassAssignmentSecurity :: Error. Wpadłem na problem, że atrybuty "id" i "typ" wydają się być domyślnie chronione, nawet gdy podjąłem określone kroki, aby przełączyć się na używanie silnych parametrów zamiast ochrony przydziału masowego. Miałem skojarzenie o nazwie "type", którego nazwa została zmieniona na "project_type", aby rozwiązać problem (atrybut był już project_type_id).

+0

Używanie 'type' dla atrybutów lub relacji jest złym pomysłem, ponieważ Rails używa tego do śledzenia relacji STI.Więc jest to mniej więcej zarezerwowany atrybut :) Również 'id' jest domyślnym parametrem, który jest ustawiany w wielu przypadkach przez router, więc może być również niestabilny. –

+0

@ d-Pixie Wystarczająco dobre, ale błędy, które dostałem, nie były naprawdę pomocne i bardzo mylące. Błąd polegający na tym, że nie należy ich używać, byłby w porządku, błąd MassAssignmentSecurity ::, gdy cały system miał być wyłączony, był bardzo mylący. type był tym, który uderzyłem i znalazłem, że wpłynęło również na id, kiedy zagłębiłem się w kod źródłowy. –

+0

Wystąpił ten sam problem, błąd nie jest opisowy. Użyj 'self.inheritance_column = nil', aby naprawić, jeśli nie używasz STI. – toxaq