Rails CRUD Parameter Problem

Mein Hintergrund ist also java-web services, aber ich versuche, den Umzug zu ROR zu machen.

Ich verwende FlexImage, um das Hochladen von Bildern und die Miniaturansichtzuspielzuführen zu verarbeiten. Ich folgte der Anleitung und CRUD Verhalten funktionierte gut an einem Punkt. Irgendwann war das CRUD-Verhalten für eines meiner Modelle (Bilder) jedoch gebrochen.

Der Fehlercode, den ich zurückbekomme, ist wie folgt: ActiveRecord::RecordNotFound in ImagesController#show -- Couldn't find Image with ID=#<Image:0x4e2bd74>. In other words, when I'm telling Rails to create/update/destroy, it is confusing the object with the id. This seems to indicate there might be a routing issue. I thought adding a partial for images might have been the trouble, but rolling back the changes didn't fix it. Mit anderen Worten, wenn ich Rails sage, dass er erstellt/aktualisieren/zerstören soll, verwechselt er das Objekt mit der ID. Dies scheint darauf hinzudeuten, dass möglicherweise ein Routingproblem vorliegt. Ich dachte, das Hinzufügen eines Teils für Bilder könnte das Problem gewesen sein, aber das Rollback der Änderungen hat es nicht behoben.

Im Folgenden sind die neuen, Show- und Update-Methoden des Controllers für das Images-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, dass show() natürlich eine entsprechende ID erwartet. Hier ist die new.html.erb zum Hochladen eines neuen Bildes:

# 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 von 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 tatsächlich hochgeladen wird und der Fehler wird auf Umleitung geworfen, um 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 bitte lassen Sie mich wissen, wenn etwas auf Sie springt.

Antwort auf "Rails CRUD Parameter Problem " 3 von antworten

Mein Vorschlag ist es, ruby-debug zu verwenden und einen Haltepunkt direkt vor dem Image.find-Aufruf festzulegen. Prüfen Sie params[:id] und sehen Sie, was es eigentlich ist.

Ein ghettoischer Ansatz, stelle dies vor den Image.find-Aufruf

logger.info params[:id].class

und sieh, was in dieser Variable ist. Ist es möglich, dass Sie eine Art vor Filter haben, der es manipuliert?

Wenn ich mir den Code ansehe, scheint mir, dass das Problem durch die Verwendung von image_url(@image) in combination with the non-RESTful in Kombination mit der nicht-RESTful image route. Route verursacht werden kann.

Sie werden wahrscheinlich die Zeile

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

aus Ihrem routes.rb. entfernen wollen.

Die Zeile

map.resources :images

sollte eigentlich ausreichen, um alle CRUD-Aktionen in Ihrem ImagesController. verfügbar zu machen.

versuchen

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

Ich denke, das ist eine idiomatischere Möglichkeit, die Umleitung zu codieren. Und +1 zu molfs Ratschlägen über RESTful Routen.