Frage

Also mein Hintergrund ist in Java Web Service, aber ich versuche, den Umzug zu ROR zu machen.

Ich bin mit FlexImage Bild-Upload und Thumbnail-Generation zu behandeln. Ich folgte den Führer und CRUD Verhalten arbeitet an einem Punkt in Ordnung. Aber an einem gewissen Punkt, CRUD Verhalten für einen meiner Modelle (Bilder) war gebrochen.

Der Fehlercode Ich bin immer wieder, wie folgt: ActiveRecord::RecordNotFound in ImagesController#show -- Couldn't find Image with ID=#<Image:0x4e2bd74>. Mit anderen Worten, wenn ich Rails sage erstellen / aktualisieren / zerstören, es ist verwirrend, das Objekt mit dem id. Dies scheint zu zeigen, könnte es ein Routing-Problem sein. Ich dachte, eine teilweise für das Hinzufügen von Bildern haben könnte das Problem gewesen, aber die Änderungen zurück haben es nicht reparieren.

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 
     # ...

Beachten Sie, dass Show () 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 ist wie folgt:

# routes.rb [excerpt]

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

Beachten Sie auch, dass ein neues Bild hat tatsächlich hochgeladen erhält und der Fehler auf Umleitung ausgelöst wird, zeigen (die eine gültige ID in params erwartet [: id] und nicht das Objekt, das aus irgendeinem Grunde es wird übergeben werden.)

Vielen Dank für Ihre Hilfe im Voraus, und lassen Sie es mich wissen, wenn etwas auf Sie springt aus.

War es hilfreich?

Lösung

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

Sie werden wahrscheinlich wollen die Zeile entfernen

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

von Ihrem routes.rb.

Die Zeile

map.resources :images

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

Andere Tipps

Mein Vorschlag ist, ruby-debug zu verwenden und eine Bruchstelle direkt vor dem Image.find Rufaufbau. Überprüfen Sie params [: id] und sehen, was es tatsächlich ist.

Ein Ghetto Ansatz, setzt diese vor dem Image.find Aufruf

logger.info params[:id].class

und sehen, was in diesen Variablen ist. Ist es möglich, dass Sie irgendeine Art von vor-Filter haben, die es manipuliert?

Versuch

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

Ich denke, das ist ein mehr idiomatischer Weg, um die Umleitung zu codieren. Und +1 bis MOLF Rat über RESTful Routen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top