Dodatkowe atrybuty

Witam

Tworzę książkę.
Book.create(params[:book] )
W params[:book] mam autor, ile_stron itd… Jak dodać jeszcze jeden parametr?
Book.create(params[:book] + [:library => ‘Main’]) nie działa.
Jak to poprawnie zrobić?

Pozdrawiam

Spróbuj tak:

Book.create(params[:book].merge(:library => 'Main'))

Najlepiej tak zbuduj formularz sobie by nie musieć dodawać żadnych parametrów

A nie łatwiej:

book = Book.new(params[:book]) book.library = "Main" book.save

Niektóre parametry trzeba dodać samemu, a nie na podstawie formularza (formularz można sobie spreparować). Może w tym wypadku też tak jest?

Jeśli chcesz po prostu ustawić domyślną wartość dla jakiegoś atrybutu to lepiej takie rzeczy robić w klasie która jest za to odpowiedzialna, w Twoim przypadku Book. Możesz np. zdefiniować funkcję after_initialize która jest wywoływana zaraz po utworzeniu obiektu:

[code=ruby]class Book < ActiveRecord::Base

def after_initialize
library = ‘Main’
end

end[/code]
Wstawianie jakiejkolwiek logiki do kontrolera która nie dotyczy kontroli zachowania aplikacji w sensie zapytań/odpowiedzi/przekierowań http to niezalecana praktyka - łatwo ją rozpoznasz w swoim kodzie jeśli metody kontrolerów mają więcej niż kilka linijek kodu, ustawiają atrybuty obiektów ActiveRecord, kopiują atrybuty jednego obiektu do drugiego, wysyłają maile etc., słowem robią wszystko to do czego nie zostały stworzone.

Dzieki wszystkim za pomoc. Wszytkie propozycje wasze działały i ta z merge i ta z ukrytym polem. Ale zrobiłem inaczej. W modelu Book dodałem:

[code=“ruby”] before_validation :signup_library

private

def signup_library
	self.library = 'Main'
end[/code]

Wyczytałem ze to najwłaściwsze miejsce na taki manewr. Czy dobrze wyczytałem?

Pozdrawiam

To zależy. Jeśli to ma symulować domyślną wartość atrybutu to optowałbym za rozwiązaniem hosiawaka, bo dzięki temu wartość atrybutu pojawia się zaraz po jego utworzeniu obiektu. Jeśli to ma być domyślna wartość dla konkretnego formularza to chyba lepiej ukryte pole w widoku, lub “merge” w kontrolerze. Inne propozycje też mają swoje zastosowania. Nie ma jednej poprawnej odpowiedzi.