2012-08-03 18 views
18

Słyszałem, że kilka osób narzekało i zamieszczało pytania o masowe zadania w Railsach. Mam ten sam błąd kilka razy i wszystko co zrobiłem to attr_accessible. Ale czym dokładnie jest przydział masy? czy ktoś mógłby wyjaśnić na przykładzie?Co to jest mass-assignment w Railsach 3

+1

Sprawdź to: http://railscasts.com/episodes/26-hackers-love-mass-assignment. Chociaż może to być trochę przestarzałe, podstawowe zasady pozostają takie same. –

+0

UWAGA: ** Railsy 4 ** lepiej radzą sobie z przypisaniem masy z [** strong parameters **] (http://weblog.rubyonrails.org/2012/3/21/strong-parameters/) w kontrolerze zamiast ochrony w modelu. Zobacz [** ten artykuł **] (http://net.tutsplus.com/tutorials/ruby/mass-assignment-rails-and-you/), aby uzyskać dokładne wyjaśnienie, czym jest przypisanie masy i techniki Rails 3/4. – Yarin

Odpowiedz

34

Mass Assignment to nazwa, którą Rails nadaje do tworzenia obiektu z parametrem hash. Jest to "przypisanie masy" polegające na tym, że przypisujesz wiele wartości atrybutom za pośrednictwem jednego operatora przypisania.

Poniższe fragmenty przeprowadzić masową przypisanie atrybutu name i topic modelu Post:

Post.new(:name => "John", :topic => "Something") 
Post.create(:name => "John", :topic => "Something") 
Post.update_attributes(:name => "John", :topic => "Something") 

Aby to działało, model musi umożliwić masowe zadania dla każdego atrybutu w hash jesteś . przekazując

Istnieją dwie sytuacje, w których nie będzie to:

  • masz attr_accessible deklaracja która robi nie obejmują :name
  • masz attr_protected który robi obejmują :name

Niedawno stał się domyślnym że atrybuty musiały być ręcznie białej liście poprzez attr_accessible w celu masowego przypisania odnieść sukces. Wcześniej, domyślny był dla atrybutów być przypisane chyba że były one wyraźnie na czarnej liście attr_protected lub dowolny inny atrybut był biało-wymienione z attr_acessible.

Ważne jest, aby rozważyć, które atrybuty mogą być masa przypisana ponieważ kod jak tak jest często:

@post = Post.new(params[:post]) 

zwykle jest stosowany, gdy użytkownik podnosi postać świadczonych przez form_for @post. W idealnym świecie wartość mieszania params[:post] powinna zawierać tylko te pola, które wyświetliliśmy w formularzu. Łatwo jest jednak użytkownikowi przekazać dodatkowe pola w żądaniu, więc w efekcie pozwalasz użytkownikowi ustawić dowolne pola na @post, a nie tylko te wyświetlane w formularzu.

Nieprzestrzeganie bezpiecznie korzystać masową zadanie doprowadziło do kilku błędów wysokim profilu w niektórych dość dużych Rails aplikacji, jak ten, który pozwolił kogoś inject their own public key do listy zaufanych kluczy na repozytorium GitHub i pchnąć kod bezpośrednio do repozytorium one nie powinien mieć dostępu do.