2013-07-10 22 views
6

Zupełnie nowe miejsce w grze Rails.Zapisywanie modelu zagnieżdżonego w Railsach 4

Jeden z modeli jest zależny od drugiego w skojarzeniu has_many/belongs_to.

Zasadniczo, podczas tworzenia "Posta" w mojej aplikacji, użytkownik może również dołączyć "Obrazy". Idealnie są to dwa osobne modele. Gdy użytkownik wybiera zdjęcie, niektóre JavaScript przesyła je do Cloudinary, a zwrócone dane (identyfikator, szerokość, wysokość itp.) Są JSON uszeregowane i ustawione na ukrytym polu.

# The HTML 
= f.hidden_field :images, :multiple => true, :class => "image-data" 

# Set our image data on the hidden field to be parsed by the server 
$(".image-data").val JSON.stringify(images) 

I oczywiście, związek istnieje w moim modelu post

has_many :images, :dependent => :destroy 
accepts_nested_attributes_for :images 

i mojego modelu Obrazek

belongs_to :post 

Gdzie gubię się, co zrobić z serializowanym danych obrazu w metodzie tworzenia kontrolera Post? Po prostu parsowania JSON i oszczędność nie tworzyć modele obrazu z danych podczas zapisywania (i nie czuje się w prawo):

params[:post][:images] = JSON.parse(params[:post][:images]) 

Wszystko to zasadniczo kulminuje do czegoś podobnego następujących parametrów:

{"post": {"title": "", "content": "", ..., "images": [{ "public_id": "", "bytes": 12345, "format": "jpg"}, { ..another image ... }]}} 

Cały ten proces wydaje się nieco zawiły - co mam teraz zrobić i czy istnieje lepszy sposób na zrobienie tego, co próbuję zrobić w pierwszej kolejności? (Są też mocne parametry wymagane dla zagnieżdżonych atrybutów takich jak ta ...?)

EDIT:

W tym momencie mam ten błąd:

Image(#91891690) expected, got ActionController::Parameters(#83350730) 

pochodzących z tej linii ...

@post = current_user.reviews.new(post_params) 

Wygląda na to, że nie tworzy obrazów z zagnieżdżonych atrybutów, ale oczekuje się. (To samo dzieje się, gdy: autozapis jest dostępny lub nie).

+0

Mam dokładnie ten sam numer – nduplessis

+0

Mb może pomóc http://stackoverflow.com/questions/10878930/got-activerecordassociationtypemismatch-on-model-save – user2915517

Odpowiedz

6

Po prostu wystąpił ten problem z błędem ActionController :: Parameters. Musisz upewnić się, że pozwalając wszystkie niezbędne parametry w swojej posts_controller, tak:

def post_params 
    params.fetch(:post).permit(:title, :content, 
          images_attributes: [:id, :public_id, :bytes, :format]) 
end 

Ważne jest, aby upewnić się, że pozwalając atrybut image.id.

0

Należy się tym zająć pod numerem accepts_nested_attributes_for. Czynienie Post.create(params[:post]) powinno również zajmować się atrybutami zagnieżdżonego obrazu. Co może być nie tak, jest to, że nie określiłeś autosave w relacji has_many. Więc możesz chcieć zobaczyć, czy to robi różnicę:

has_many :images, :dependent => :destroy, :autosave => true 

To powinno także zapisać obrazy po zapisaniu postu.

+0

Dzięki za odpowiedź. Próbowałem tego, chociaż nie miało to większego znaczenia, chociaż otrzymałem interesującą odpowiedź, którą wcześniej edytowałem ("Obraz oczekiwany, ale otrzymałem Parametry" dla zwięzłości). – ICDevin

1

Musisz budować params tak:

params[:post][:images_attributes] = { ... } 

Trzeba *_attributes na kluczowy nazwą images.

Powiązane problemy