Rails i dziedziczenie

Witam,

Jestem kompletnie zielony w temacie railsa także prosiłbym o wyrozumiałość, gdyby coś niejasno wytłumaczył. Mam problem z dziedziczeniem (z modelu Product dziedziczy klasa book). Zapisalem to w ten sposób:

class Product < ActiveRecord::Base attr_accessible :amountAvailable, :name, :price end

class Book < Product attr_accessible :author end
Dodatkowo utworzyłem taki formularz:

[code]<%= form_for “product”, :url => { :action => “newproduct” } do |f| %>

<%= f.label “name” %>

<%= f.text_field “name” %>

<%= f.label “price” %>

<%= f.text_field “price” %>

<%= f.label “Amount Available” %>

<%= f.text_field “amountAvailable” %>

<%= f.label “Choose a type:” %>

<%= radio_button_tag(:type, “book”) %>
<%= label_tag(:type_book, “Book”) %>

<%= radio_button_tag(:type, “movie”) %>
<%= label_tag(:type_movie, “Movie”) %>

<%= f.label “Author” %>

<%= f.text_field “author” %>

<%= f.submit %>

<% end %>[/code]
Następnie w kontrolerze próbuje obsłużyć dodawanie nowego przedmiotu w taki sposób:

[code] def newproduct

if params["product"]
	data = {
	"name" => params["product"]["name"],
	"price" => params["product"]["price"],
	"amountAvailable" => params["product"]["amountAvailable"],
	}
	if params["type"] == "book"
		data["author"] = params["product"]["author"]
		logger.info(data)
		@newBook = Book.new(data)
		@newBook.save
	end
	if params["type"] == "movie"
		
	end
end

end[/code]
Niestety dostaje komunikat, że atrybut autora nie jest dostępny (unknown attribute: author). Dodam ze jeżeli zrezygnowałbym z pola authora to rails dodałby mi nowy produkt (product, a nie book pomimo, że tworzę @newBook = Book.new(data) @newBook.save ). Bardzo bym prosił o wskazanie gdzie popełniam błąd.

Z góry dzięki za pomoc!

Poświęć 30 min na przeglądnięcie przewodnika po rails’ach. Wszystko jest źle…

poczytaj o STI w Rails np. tu i tu

możesz też pomyśleć o zastosowaniu hstore

Wydaje mi się że takie uwagi możesz sobie darować. Na samym początku zaznaczyłem, że kompletnie nie znam się na railsach a całość oparłem na przykładach. Wiem, że taki formularz działa bez żadnego problemu dla samego produktu(bez dziedziczenia), a w samych modelach też za wiele nie zrobiłem także jakbyś mógł uzasadnić czemu “wszystko” jest źle będę wdzięczny. Bo samo wskazanie standardowego przewodnika do railsa jest tak pomocne jak odesłanie do google.

Dzięki! Myślę, że to może być rozwiązaniem.

Wydaje mi się że takie uwagi możesz sobie darować.[/quote]
Skoro ma sobie darować, to jak chcesz się nauczyć pisać poprawnie w Railsach?

(Przepraszam że tak nie z tematem związane, ale ludzie nie potrafią przyjmować krytyki)

Serio? Nie ma nic przeciwko krytyce. Ale niech ona ma jakiś sens. @rajah jedyne co zrobił to napisał, że wszystko jest źle, ale nie napisał ani dlaczego ani co konkretnie. Dodatkowo skierował mnie na główną strone jednego z podstawowych portali o railsie. W związku z tym, że jego wypowiedź miała na celu jedynie wyśmianie, bez żadnej formy pomocy napisałem że takie posty może sobie darować… Jeśli to oznacza tyle, że nie znoszę krytyki to spoko.

Wystarczyła odpowiedź na temat tak jak zrobił to @zlw i tyle. Zdaje sobie sprawe, że mój kod jest zły. Dlatego pytam i proszę o pomoc, jednak krytykować żeby krytykować moim zdaniem jest bez sensu i uwagi w stylu poczytaj przewodnik po railsach nie jest konstruktywny.

Wydaje mi się że nie ma co tu wymieniać pojedynczych błędów i kolega dobrze zrobił że Cię skierował do podstawowego tutoriala, ja polecam: http://ruby.railstutorial.org/ruby-on-rails-tutorial-book

Doskonale widać że nie poświęciłeś zbyt dużo czasu na samodzielną naukę, a bez tego, niestety nasza pomoc to strata czasu. Przerób Railstutorial od deski do deski (powinno Ci zająć 1-2 dni) i wróć a z chęcią pomożemy.

Nikt tu nie stara się Ciebie wyśmiać, każdy zaczynał - ale ale - widać że nie łapiesz podstawowych konwencji a to jest w każdym podstawowym tutorialu.

[quote=hubertlepicki]Wydaje mi się że nie ma co tu wymieniać pojedynczych błędów i kolega dobrze zrobił że Cię skierował do podstawowego tutoriala, ja polecam: http://ruby.railstutorial.org/ruby-on-rails-tutorial-book

Doskonale widać że nie poświęciłeś zbyt dużo czasu na samodzielną naukę, a bez tego, niestety nasza pomoc to strata czasu. Przerób Railstutorial od deski do deski (powinno Ci zająć 1-2 dni) i wróć a z chęcią pomożemy.

Nikt tu nie stara się Ciebie wyśmiać, każdy zaczynał - ale ale - widać że nie łapiesz podstawowych konwencji a to jest w każdym podstawowym tutorialu.[/quote]
Okey dzięki wielkie za pomoc. Zastosuję się do porady, aczkolwiek jeszcze z ciekawości zapytam. Mógłbyś wymienić jeden z tym podstawowych błędów? Kodu railsowego jest nie dużo także byłbym wdzięczny za wskazanie jednego(najlepiej) kilku z nich.

Z góry dzięki za odpowiedź.

Nie ma znowu tego aż tak dużo ;). Ja bym powiedział, że największy problem masz właśnie w braku zrozumienia o co chodzi w STI, a przez to masz ogromny bałagan w kontrolerze. Chodzi o to, że jakbyś dokładnie przerobił jakiś tutorial, to nawet patrząc szybko na strukturę kodu zauważyłbyś, że coś jest nie tak.

Generalnie kontroler powinien wyglądać mniej więcej tak (pamiętaj, że mniej więcej, tzn. chodzi mi o to, że tam zwykle nie powinno być takiego hałasu jak u Ciebie):

[code] def create
@product = Product.new(params[:product])

if @product.save
  redirect_to @product
else
  render :action => "new"
end

end[/code]
Tutaj może być trochę inaczej, bo można by użyć nowego respond_with, czy dać jakieś komunikaty używając “flash”, ale tak mniej więcej wygląda kod z guides. I teraz jedna z najważniejszych rzeczy, którą powinieneś zrozumieć, to że railsy są frameworkiem, co za sobą niesie przeróżne konwencje, które pozwalają używać trochę “magii”. I nawet w przypadku STI ten kod pozostanie bardzo podobny, jeśli nie ten sam.

Jak nazwiesz akcję newproduct, a nie create, to nie będziesz mógł użyć w routes “resources”, tylko będziesz musiał robić customowe ścieżki (odsyłam do guides), jak nawrzucasz ifów nie wiedząc, że type w przypadku dziedziczenia powinien sam się ustawić, to będziesz miał mnóstwo niepotrzebnego kodu (odsyłam do guides). I tu w co 3 linijce można by pisać “odsyłam do guides” ;).

@sarniak dzięki wielkie za odpowiedź. Faktycznie nie wiedziałem, że aż tak trzeba trzymać się konwencji. Zależało mi żeby jeden kontroler obsługiwał kilka modeli stąd zmienione nazwy akcji…

Zapoznaje się w takim razie z STI i postaram się ogarnać trochę ,magii" :wink: