Parámetros carriles CRUD Edición
-
21-08-2019 - |
Pregunta
Así que mi formación es en servicios web Java, pero estoy tratando de hacer el movimiento a ROR.
Estoy usando FlexImage para manejar la carga de imágenes y la generación de miniaturas. Seguí la guía y el comportamiento CRUD estaba trabajando bien en un momento dado. Sin embargo, en algún momento, el comportamiento CRUD para uno de mis modelos (Imágenes) estaba roto.
El código de error que estoy recibiendo de vuelta es el siguiente: ActiveRecord::RecordNotFound in ImagesController#show -- Couldn't find Image with ID=#<Image:0x4e2bd74>.
En otras palabras, cuando digo rieles para crear / actualizar / destruir, se confunde el objeto con el id. Esto parece indicar que podría haber un problema de enrutamiento. Pensé que la adición de un parcial de imágenes que podría haber sido el problema, pero hacer retroceder los cambios no solucionarlo.
Los siguientes son los nuevos, mostrar y Métodos de actualización del controlador para el modelo de archivo:
# 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
# ...
Tenga en cuenta que show () es, por supuesto, esperando una identificación apropiada. Aquí está la new.html.erb para cargar una nueva imagen:
# 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 parte pertinente de routes.rb son como sigue:
# routes.rb [excerpt]
map.resources :images
map.image 'images/:action/:id.:format', :controller => 'images'
Tenga en cuenta también que una nueva imagen hace conseguir realmente subido y el error se lanza sobre redirección a mostrar (que está esperando un identificador válido de params [: id] y no el objeto, que por cualquier razón que está siendo entregado.)
Gracias por su ayuda por adelantado, y por favor, hágamelo saber si algo salta a la vista.
Solución
A partir de mirar el código me parece que el problema puede deberse al uso de image_url(@image)
en combinación con la ruta no reparador image
.
Es probable que desee quitar la línea
map.image 'images/:action/:id.:format', :controller => 'images'
de su routes.rb
.
La línea
map.resources :images
En realidad debería ser suficiente para exponer todas las acciones CRUD en su ImagesController
.
Otros consejos
Mi sugerencia es utilizar rubí de depuración y establecer un punto de ruptura derecha antes de la llamada Image.find. Inspeccionar params [: id] y ver lo que realmente es.
Un enfoque más gueto, poner esto antes de la llamada Image.find
logger.info params[:id].class
y ver lo que hay en esa variable. ¿Es posible que usted tiene algún tipo de filtro antes de que se manipularlo?
try
redirect_to :action => "show", :id => @image
Creo que es una forma más idiomática para codificar la redirección. Y 1 a molf de consejos sobre rutas RESTful.