2012-03-17 11 views
22

Zastanawiałem się, po utworzeniu obiektu często można ustawić wiele atrybutów w jednej linii npZmień wielokrotny przedmiot w jednej linii

@object = Model.new(:attr1=>"asdf", :attr2 => 13, :attr3 => "asdfasdfasfd") 

Co jeśli chcę użyć find_or_create_by, a potem zmienić inne atrybuty później? Zazwyczaj będę musiał korzystać z wielu linii, np: @object = Model.find_or_create_by_attr1_and_attr2 ("asdf", 13) @ object.attr3 = "asdfasdf" @ object.attr4 = "asdf"

Czy jest jakiś sposób ustawiania atrybutów za pomocą skrótu, podobnie do sposobu, w jaki metoda Model.new akceptuje pary klucz-wartość? Jestem zainteresowany tym, ponieważ chciałbym móc ustawić wiele atrybutów w jednej linii jak:

@object = Model.find_or_create_by_attr1_and_attr2("asdf", 13) 
@object.some_method(:attr3 => "asdfasdf", :attr4 => "asdfasdf") 

Jeśli ktoś ma jakieś pomysły, że byłoby świetnie!

Odpowiedz

37

Chcesz użyć assign_attributes lub update_attributes:

@object.assign_attributes(:attr3 => "asdfasdf", :attr4 => "asdfasdf") 

Jeśli zdecydujesz się update_attributes zamiast, obiekt zostanie zapisany natychmiast (w oczekiwaniu na jakiekolwiek walidacje, oczywiście)

+0

Och, hej, @jay, nawiasem mówiąc! : ^) – rjz

+0

hej to nie działa, dostaję niezdefiniowany błąd metody .. i, hej? czy wcześniej odpowiedziałeś na jedno z moich pytań? – jay

+0

Taa ... coś o metodzie ': serialize' ostatniej nocy. Jakiej wersji szyn używasz? – rjz

3

Metody których szukasz są nazywane assign_attributes lub update_attributes.

@object.assign_attributes(:attr3 => "asdfasdf", :attr4 => "asdfasf") # @object now has attr3 and attr4 set. 
@object.update_attributes(:attr3 => "asdfasdf", :attr4 => "asdfasf") # @object now has attr3 and attr4 set and committed to the database. 

Istnieją pewne obawy związane z bezpieczeństwem stosowania tych metod w aplikacjach Rails. Jeśli zamierzasz użyć jednego z nich, szczególnie w kontrolerze, koniecznie zapoznaj się z dokumentacją na stronie attr_accessible, aby złośliwi użytkownicy nie mogli przekazywać dowolnych informacji do pól modelu, które wolałyby nie być masowo przypisywane.

+0

hej, to nie działa .. Dostaję niezdefiniowany błąd metody, zarówno w konsoli szyny, jak iw kontrolerze. Wygląda jednak na legit ... – jay