Rotaie CRUD Parametri Edizione
-
21-08-2019 - |
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.
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.