2009-05-14 15 views
0

So ist mein Hintergrund in Java-Web-Services, aber ich versuche, den Umzug in ROR.Rails CRUD Parameter Problem

Ich verwende FlexImage, um das Hochladen von Bildern und die Erstellung von Miniaturansichten zu verarbeiten. Ich folgte dem Führer und CRUD Verhalten funktionierte an einem Punkt gut. Irgendwann wurde jedoch das CRUD-Verhalten für eines meiner Modelle (Images) unterbrochen.

Der Fehlercode, den ich bekomme, lautet wie folgt: ActiveRecord::RecordNotFound in ImagesController#show -- Couldn't find Image with ID=#<Image:0x4e2bd74>. Mit anderen Worten, wenn ich Rails zu erstellen/update/destroy sagen, verwirrt es das Objekt mit der ID. Dies deutet darauf hin, dass möglicherweise ein Routing-Problem vorliegt. Ich dachte, ein Teil für Bilder könnte das Problem gewesen sein, aber das Zurücksetzen der Änderungen hat es nicht behoben.

Im Folgenden werden die neuen, Show und Aktualisierungsmethoden des Controllers für die Bilder Modell:

 # images_controller.rb 

     # ... 

     def new 
     @image = Image.new 

     respond_to do |format| 
      format.html # new.html.erb 
      format.xml { render :xml => @image } 
     end 
     end 

    # ... 
    def show 
    @image = Image.find(params[:id]) 

    respond_to do |format| 
     format.jpg # show.jpg.erb 
     format.html # show.html.erb 
     format.xml { render :xml => @image } 
    end 
    end 



    # ... 

     def create 
     @image = Image.new(params[:image]) 

     if @image.save 
     redirect_to image_url(@image) 
     else 
     flash[:notice] = 'Your image did not pass validation.' 
     render :action => 'new' 
     end 
     end 
    # ... 

Hinweis, die zeigen,() ist, natürlich, eine entsprechende ID zu erwarten. Hier ist die new.html.erb für ein neues Bild hochgeladen werden:

# new.html.erb [upload image] 
<h1>New image</h1> 

<% form_for @image, :html => { :multipart => true } do |f| %> 
    <%= f.error_messages %> 
    <table><tr><td width="50%"> 
    <p> 
    <%= f.label :filename %><br /> 
    <%= f.text_field :filename %></p> 
    </td> 
    <td><p><b>Upload Image</b><br /> 
    <%= f.file_field :image_file %><br /> 
    or URL: <%= f.text_field :image_file_url %> 
    <%= f.hidden_field :image_file_temp %> 
    </td> 
    <td> 
    <b>Uploaded Image:</b><br /> 
    <%= embedded_image_tag(@image.operate { |img| img.resize 100 }) if @image.has_image? %> 
    </td> 
    </tr> 

    </table> 
    <p> 
    <%= f.label :description %><br /> 
    <%= f.text_area :description %> 
    </p> 
    <p> 
    <%= f.submit 'Create' %> 
    </p> 
<% end %> 

<%= link_to 'Back', images_path %> 

Der relevante Teil der routes.rb sind wie folgt:

# routes.rb [excerpt] 

    map.resources :images 
    map.image 'images/:action/:id.:format', :controller => 'images' 

Beachten Sie auch, dass ein neues Bild ist tatsächlich hochgeladen erhalten und der Fehler wird auf Redirect zu zeigen (die eine gültige ID in Params [: ID] erwartet und nicht das Objekt, das aus welchem ​​Grund auch immer es übergeben wird.)

Vielen Dank für Ihre Hilfe im Voraus, und lassen Sie sich bitte Ich weiß, ob etwas springt ut bei dir.

+0

Da der Fehler in der "show" -Methode auftritt, möchten Sie das vielleicht auch posten? – molf

+0

Posted; Beachten Sie, dass das Problem auch bei update angezeigt wird und auch zerstört wird. –

+0

Wenn das hilft, macht die destroy() Methode auch, was es tun soll, wenn ich '/ destroy/id' manuell in die URL eintrage. –

Antwort

5

Aus dem Blick auf den Code scheint mir, dass das Problem durch die Verwendung image_url(@image) in Kombination mit der nicht-RESTful image Route verursacht werden kann.

Sie werden wahrscheinlich die Linie

map.image 'images/:action/:id.:format', :controller => 'images' 

von Ihrem routes.rb entfernen möchten.

Die Linie

map.resources :images 

sollte eigentlich genug sein, um alle CRUD Aktionen in Ihrem ImagesController auszusetzen.

+0

Ich habe mich gefragt. Danke für die Hilfe! –

+0

Sie können dies sehen, wenn Sie Ihre 'map.image' Zeile ein- und ausschließen und (in der Befehlszeile)' rake routes' ausführen. Dies zeigt Ihnen, auf welche Routen Rails wartet und wie die URLs auf Ihre verschiedenen Controller und Aktionen geroutet werden. redirect_to: action => „show“,: –

1

Mein Vorschlag ist, ruby-debug zu verwenden und einen Unterbrechungspunkt direkt vor dem Image.find-Aufruf festzulegen. Untersuchen Sie params [: id] und sehen Sie, was es tatsächlich ist.

Ein Ghetto Ansatz, diese vor dem Image.find Anruf

logger.info params[:id].class 

und sehen, was in diesen Variablen ist. Ist es möglich, dass Sie einen Filter vor sich haben, der ihn manipuliert?

+0

Danke! Genau das scheint zu passieren. Die Klasse von params [: id] ist eine Zeichenfolge, und ihr Wert ist gleich dem Objekt-Handle, d. H. "# ". Was könnte die ID so transformieren? Die einzige Anweisung unterhalb der Definition der ImagesController-Klasse ist "cache_pages: show". –

+0

Machen Sie eine Quelltextanzeige in Ihrem Browser und sehen Sie, was sich in der Form befindet. Das ist meine erste Vermutung. – jshen

0

versuchen

 
    redirect_to :action => "show", :id => @image

Ich denke, das ist ein mehr idiomatischer Weg, um die Umleitung zu codieren. Und +1 zu molfs Rat bezüglich RESTvoller Routen.

+0

Wenigstens haben Sie die ID in diesem Fall umfassen müssen id => @ images.id – molf

+0

Eigentlich funktioniert es ohne, und es gibt die Möglichkeit, Rails #to_param zu verwenden, wenn Einer ist auf dem Modell definiert. – asplake

+0

Sie haben recht, ich war (anscheinend zu früh) auf Ihre Pre-Edit-Version. Egal jetzt;) – molf