¡Tengan paciencia conmigo, soy nuevo en las publicaciones y Rails, así que lo siento si me equivoco al redactar!
Estoy trabajando en una aplicación Rails con muchos modelos similares. Cada vista tiene un _form.html.haml parcial que difiere en contenido pero contiene componentes similares, como botones para enviar, eliminar, etc. Cada modelo tiene_muchas_fotos adjuntas, y en el formulario puede agregar o eliminar fotos. El haml para eliminar fotos se ve así, donde la variable se reemplaza con cualquier vista en la que se encuentre _form.html.haml :
.gallery#form - @VARIABLE.photo.each_with_index do |image, index| .overlay-container .img-square{ :style => "background-image: url(#{rails_blob_url(photo(@VARIABLE, index))})", :alt => "Photo of #{image}" } = link_to("Delete", delete_image_attachment_VARIABLE_url(image), method: :delete, class: 'button delete overlay')Para que la eliminación funcione en cada foto, este código está en cada controlador:
def delete_image_attachment @photo = ActiveStorage::Attachment.find(params[:id]) @photo.purge redirect_back fallback_location: @VARIABLE flash[:success] = 'Photo was successfully deleted.' end Y routes.rb tiene este trozo de código para cada modelo:
resources :VARIABLE do member do delete :delete_image_attachment end endSin embargo, tengo alrededor de una docena de modelos en los que necesito hacer esto. Mi objetivo es llevar la galería a un nuevo parcial, ya que se usará en cada _form independientemente del otro contenido. Sin embargo, la función de eliminación (aunque la misma para todos los controladores) está vinculada al controlador/routes.rb de cada modelo.
Debe haber alguna forma de SECAR esta funcionalidad en un par de archivos en lugar de copiar y pegar para cada modelo, pero mis búsquedas en Google no han arrojado nada. Por lo tanto, ¡cualquier guía o mejor convención de Rails es muy apreciada!
Si estoy entendiendo la estructura correctamente, parece que querrías hacer algo como lo siguiente:
id de la foto para borrar.redirect a dónde redirigir al usuario una vez completada la acción.Ahora solo habrá 1 ruta para manejar el controlador de arriba.
Para representar una colección de imágenes con una URL de redireccionamiento que le permite establecer el siguiente estado para el parcial:
photos una colección de imágenes para renderizar.redirect_url esto se pasa como un parámetro de consulta al controlador de imágenes de eliminación centralizado.Esto debería poder SECAR su implementación. Actualmente, lo único que veo que combina la vista con la eliminación es la URL de redireccionamiento. Al abstraer eso y moverlo esencialmente a un parámetro para el parcial permitirá la reutilización y la flexibilidad.
Ya identificó su acoplamiento a través de @VARIABLE , aquí hay una muestra rápida de cómo esperaría que terminara luciendo:
.gallery#form - @photos.each_with_index do |image, index| .overlay-container .img-square{ :style => "background-image: url(#{rails_blob_url(photo(@VARIABLE, index))})", :alt => "Photo of #{image}" } = link_to("Delete", delete_image_attachment_url(image, redirect: @redirect_url), method: :delete, class: 'button delete overlay') Esto requeriría: photos y redirect_url Así que asegúrese de configurar @photos y @redirect_url en el controlador de consumo.
@photos = GET_PHOTOS_HERE @redirect_url = 'some-redirect-path' render partial: 'photos_partial' photos = GET_PHOTOS_HERE render partial: 'photos_partial', locals: { photos: photos, redirect: 'some-redirect-path' }`Nota : es posible que deba cambiar la forma en que accede a las variables locales en la plantilla.
https://guides.rubyonrails.org/layouts_and_rendering.html#passing-local-variables
def delete_image_attachment @photo = ActiveStorage::Attachment.find(params[:id]) @photo.purge redirect_back fallback_location: params[:redirect] flash[:success] = 'Photo was successfully deleted.' endAquí solo tendría la ruta única para eliminar cualquier archivo adjunto de imagen y señalaría el único controlador de arriba.
delete 'resources/image_attachment/:id', to: 'resources#delete_image_attachment'Nota : Reemplace "recursos" con el nombre de su controlador, o el alcance/nombre que le gustaría.
PD : Ha pasado un tiempo desde que hice Rails, así que no estoy completamente seguro de la precisión o de su entorno.