Zapis ID do bazy Project has_many : images

Witam mam dwa modele Jeden to Projects drugi to Images. Chcial bym upladować za jednym razem kilka obrazków za pomocą plupload HTML5
W sumie wszystko działa ok ( o ile recznie wpisze id projektu)

images_controller.rb

def create

  @image = Image.new(params[:image])
   @image.project_id = "27" 
   @image.file = params[:file]
   @image.save!  
   render :nothing => true     
 end

W powyższym wypadku jezeli recznie podam ID projektu obrazki się upladują i rekordy zapisywane są prawidłowo dla każdego obrazka
W jaki sposób wywolać project_id ? zamiast tego przykladowego 27 ? próbowałem już wszystkiego i nie działa :frowning:

Proszę o podpowiedź !!!

Niby powinno być jakoś tak :

@image.project_id = params[:id]

Ale nie wiem czego nie widzi tego id ???

Poniżej logi :

SQL (1.1ms) INSERT INTO “images” (“created_at”, “file”, “project_id”, “updated_at”) VALUES (?, ?, ?, ?) [[“created_at”, Thu, 21 Jul 2011 23:04:28 UTC +00:00], [“file”, “sony75-200.jpg”], [“project_id”, nil], [“updated_at”, Thu, 21 Jul 2011 23:04:28 UTC +00:00]]
Rendered text template (0.0ms)
Completed 200 OK in 169ms (Views: 1.8ms | ActiveRecord: 1.4ms)

pokaż linię logu która pokazuje jakie parametry są przekazywane.

@image.project = Project.find(params[:project_id])
Wtedy masz trzy możliwości:

  1. Przekazujesz project_id w adresie np. POST /images?project_id=27
  2. Przekazujesz project_id w danych POST
  3. W routes.rb zagnieżdżasz images w projects i dodajesz obrazki przez POST /projects/:project_id/images (project_images_path)

Dzięki K87 ale jakoś nie mogę tego rozgryść

w tej chwili jak edytuje project to z takiego poziomu : http://localhost:3000/projects/27/edit

Podmienilem kod w kontlorerze na proponowany powyzej " @image.project = Project.find(params[:project_id]) "
w route.rb zrobilem zagniezdzenie :

resources :images

resources :projects do
resources :images
end

Ale cos nie bardzo mi to smiga -> plupload wogóle teraz nie uploaduje obrazkow … :frowning: wywala błąd

Started POST “/images” for 127.0.0.1 at 2011-07-22 15:39:27 +0200
Processing by ImagesController#create as HTML
Parameters: {“name”=>“IMG_0839.JPG”, “authenticity_token”=>“sTgFqoqLSYsYeKauWiW6pI7Kx1KIU0rp6N6Zsr5ylxQ=”, “file”=>#<ActionDispatch::Http::UploadedFile:0x0000010595c5a8 @original_filename=“IMG_0839.JPG”, @content_type=“image/jpeg”, @headers=“Content-Disposition: form-data; name=“file”; filename=“IMG_0839.JPG”\r\nContent-Type: image/jpeg\r\n”, @tempfile=#<File:/var/folders/Zj/ZjFPRSOdGXWm-oet-uE9O++++TI/-Tmp-/RackMultipart20110722-26813-36mm4o>>}
Completed 404 Not Found in 10ms

ActiveRecord::RecordNotFound (Couldn’t find Project without an ID):
app/controllers/images_controller.rb:20:in `create’

Rendered /Users/jakubcelewicz/.rvm/gems/ruby-1.9.2-p180@railspre/gems/actionpack-3.1.0.rc1/lib/action_dispatch/middleware/templates/rescues/_trace.erb (0.9ms)
Rendered /Users/jakubcelewicz/.rvm/gems/ruby-1.9.2-p180@railspre/gems/actionpack-3.1.0.rc1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (0.9ms)
Rendered /Users/jakubcelewicz/.rvm/gems/ruby-1.9.2-p180@railspre/gems/actionpack-3.1.0.rc1/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (3.8ms)

Która z tych trzech metod myślicie jest najlepsza ?

Jak mam przekazać posta w view tak żeby bylo bezpiecznie ? za pomocą helpera hidden_field ?

Pozdr

Jeżeli już zagnieździłeś images w projects to powinieneś request z formularza wysyłać na inny adres - nie ten z helpera images_path, tylko project_images_path(@project).

Dodalem <%= hidden_field_tag :project_id, @project.id %> do projects _form.html.erb niby jest zmienna post ale id sie nie zapusuje dalej … :frowning:

Ok zmienilem scieżke requesta na poniższą :

url : ‘<%= project_images_path(@project) %>’,

I Działa :slight_smile: !!! - Dzieki bardzo zgryw :slight_smile:

W images_controller.rb mam jednak po staremu :

@image.project_id = params[:project_id]

No a z view wyalilem <%= hidden_field_tag :project_id, @project.id %>

Tylko teraz mi wywala No route matches {:controller=>“images”} jak proboje listowac projekty http://localhost:3000/projects
ale zaraz moze dojde czemu …

Hym tutaj tablica routingu :

project_images GET /projects/:project_id/images(.:format) {:action=>“index”, :controller=>“images”}
POST /projects/:project_id/images(.:format) {:action=>“create”, :controller=>“images”}
new_project_image GET /projects/:project_id/images/new(.:format) {:action=>“new”, :controller=>“images”}
edit_project_image GET /projects/:project_id/images/:id/edit(.:format) {:action=>“edit”, :controller=>“images”}
project_image GET /projects/:project_id/images/:id(.:format) {:action=>“show”, :controller=>“images”}
PUT /projects/:project_id/images/:id(.:format) {:action=>“update”, :controller=>“images”}
DELETE /projects/:project_id/images/:id(.:format) {:action=>“destroy”, :controller=>“images”}
projects GET /projects(.:format) {:action=>“index”, :controller=>“projects”}
POST /projects(.:format) {:action=>“create”, :controller=>“projects”}
new_project GET /projects/new(.:format) {:action=>“new”, :controller=>“projects”}
edit_project GET /projects/:id/edit(.:format) {:action=>“edit”, :controller=>“projects”}
project GET /projects/:id(.:format) {:action=>“show”, :controller=>“projects”}
PUT /projects/:id(.:format) {:action=>“update”, :controller=>“projects”}
DELETE /projects/:id(.:format) {:action=>“destroy”, :controller=>“projects”}
images GET /images(.:format) {:action=>“index”, :controller=>“images”}
POST /images(.:format) {:action=>“create”, :controller=>“images”}
new_image GET /images/new(.:format) {:action=>“new”, :controller=>“images”}
edit_image GET /images/:id/edit(.:format) {:action=>“edit”, :controller=>“images”}
image GET /images/:id(.:format) {:action=>“show”, :controller=>“images”}
PUT /images/:id(.:format) {:action=>“update”, :controller=>“images”}
DELETE /images/:id(.:format) {:action=>“destroy”, :controller=>“images”}
home_index GET /home/index(.:format) {:controller=>“home”, :action=>“index”}
root / {:controller=>“home”, :action=>“index”}

Powie ktoś dlaczego wywala mi No route matches {:controller=>“images”} ???

Pozdr :slight_smile:

To raczej kwestia czegoś co masz w widoku - np. linka do formularza dodawania obrazków, lub czegoś w tym stylu, poszukaj tam.

Co do samego tworzenia obrazków, zamiast przypisywać @image.project_id moim zdaniem bardziej koszernie jest zrobić to w ten sposób:

@project = Project.find(params[:project_id]) @project.images.create(params[:image]) # chociaż w twoim przypadku chyba ręczenie create(:file => params[:file], itd...