Domanda

Quindi, il mio background è nel settore dei servizi Web Java, ma sto cercando di fare il passaggio a ROR.

sto usando Fleximage per gestire il caricamento di immagini e la generazione delle miniature. Ho seguito la guida e il comportamento CRUD stava lavorando bene a un certo punto. Tuttavia, ad un certo punto, il comportamento CRUD per uno dei miei modelli (Immagini) era rotto.

Il codice di errore sto ottenendo indietro è la seguente: ActiveRecord::RecordNotFound in ImagesController#show -- Couldn't find Image with ID=#<Image:0x4e2bd74>. In altre parole, quando sto dicendo Rails per creare / aggiornare / distruggere, si confonde l'oggetto con l'id. Questo sembra indicare che ci potrebbe essere un problema di routing. Ho pensato che l'aggiunta di un parziale per le immagini potrebbe essere stata la difficoltà, ma il rollback le modifiche non lo ha risolto.

Di seguito sono riportati i nuovi, spettacolo e aggiornare i metodi del controller per il modello Immagini:

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

Si noti che show () è, naturalmente, in attesa di un id appropriata. Ecco il new.html.erb per caricare una nuova immagine:

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

La quota di competenza di routes.rb sono i seguenti:

# routes.rb [excerpt]

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

Si noti inoltre che una nuova immagine fa ottenere effettivamente caricato e l'errore viene gettato sul reindirizzamento per mostrare (che è in attesa di un valido documento di identità in params [: id] e non l'oggetto che per qualsiasi ragione esso viene consegnato.)

Grazie per il vostro aiuto in anticipo, e per favore fatemi sapere se qualcosa salta fuori a voi.

È stato utile?

Soluzione

Da guardando il codice mi sembra che il problema può essere causato da utilizzando image_url(@image) in combinazione con il percorso non RESTful image.

Probabilmente si vuole rimuovere la riga

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

dal routes.rb.

La linea

map.resources :images

dovrebbe in realtà essere sufficiente per esporre tutte le azioni CRUD nel vostro ImagesController.

Altri suggerimenti

Il mio suggerimento è quello di utilizzare ruby-debug e impostare un proprio punto di interruzione prima della chiamata Image.find. Ispezionare params [: id] e vedere ciò che effettivamente è.

Un altro approccio del ghetto, ha messo questo prima che la chiamata Image.find

logger.info params[:id].class

e vedere cosa c'è in quella variabile. E 'possibile che si dispone di una sorta di prima filtro che è come gestire questo tipo?

try

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

Penso che questo sia un modo più idiomatico per codificare il redirect. E +1 per di molf consigli sui percorsi RESTful.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top