Vraag Toegang tot afbeeldingen op productie, vanuit javascript, in Rails 4


Het lijkt erop dat nu in Rails 4 met behulp van asset pipeline en de tandwiel-rails edelsteen, wanneer afbeeldingen worden verwerkt, hun bestandsnaam is toegevoegd met een md5-vingerafdruk zoals css en javascript. Hoewel dit logisch is omdat md5-vingerafdrukken zijn geweldig, het maakt het steeds moeilijker om toegang te krijgen tot die afbeelding vanuit javascript. In rails 3.2 had ik toegang tot de afbeelding met /assets/image_name.jpg en het zou goed dienen, maar in rails 4 bestaat dat item niet, het bestaat alleen met de md5-vingerafdruk in de naam.

Ik weet dat rails helpers biedt om via erb toegang te krijgen tot de afbeelding <%= asset-url("image_name.jpg") %> maar dat is minder ideaal in javascript, omdat ik erb niet gebruik in mijn js. Er zijn tal van manieren om dit te hacken met data-attributen die in de views dienen of een script-tag gebruiken in mijn mening en wat globals in te stellen, maar ik ben op zoek naar een mooie oplossing voor dit probleem, als het bestaat.

Alle hulp wordt gewaardeerd, bedankt.


14
2018-02-14 16:36


oorsprong


antwoorden:


Een andere optie om te overwegen (hoewel ik het niet zou aanbevelen) is om een ​​aangepaste route te gebruiken in uw toepassingscontroller om het activapad voor u in de controller te pakken en de URL terug te sturen naar het item met de md5-hash of mogelijk alleen de onbewerkte binaire gegevens van het activum (hoewel dit de verwerkingsoverhead aan uw toepassing zal toevoegen).

U maakt bijvoorbeeld een AJAX-verzoek aan http://yourapp.com/images?file=my_image.jpg

In uw controller ziet uw actiemethode er dan als volgt uit:

def images
  ActionController::Base.helpers.asset_url(params[:file])
end

Hiermee wordt het URL-pad naar het item geretourneerd. Het nadeel van deze methode is dat je twee aanvragen moet indienen aan de JS-kant. De eerste om het pad naar het item te krijgen en het tweede om dat item daadwerkelijk te laden met het geretourneerde pad.

Om dit tot één verzoek terug te brengen, zou u de toepassing de afbeelding uit het bestandssysteem kunnen laten lezen en de juiste headers kunnen terugsturen, zodat de browser denkt dat het een afbeelding is die wordt geretourneerd en daarom de verstrekte URL zal weergeven. Dit zou echter veel meer werk voor de applicatie en veel meer onnodige schijf-IO op uw server zijn.

Het kan twee verzoeken per afbeelding op de client kosten om te bereiken wat je wilt, maar je moet ergens opofferen ...


1
2017-08-17 09:04



Waarom moet u de activapijplijn voor afbeeldingen gebruiken? Ik krijg het hashing-gedrag. Maar normaal zouden de activa voorverwerkt zijn. Als u de afbeeldingen in de openbare hiërarchie plaatst zoals in de oudheid, krijgt u normale padroutering.

Hier is een citaat uit de Asset Pipleline gids waarvan ik denk dat het relevant is. "Activa kunnen nog steeds in de openbare hiërarchie worden geplaatst.Alle assets onder het publiek worden door de applicatie of webserver als statische bestanden geserveerd.Gebruik app / assets voor bestanden die een voorbewerking nodig hebben voordat ze worden aangeboden."


0
2018-02-14 19:59



Helaas denk ik dat je vastzit aan het toevoegen van een ERB-uitbreiding aan je JS en het gebruik van de asset-helpers, of dat je de asset-pipeline voor de assets niet gebruikt.


0
2018-02-16 16:07



Als je zegt "Ik gebruik erb niet in mijn js", bedoel je dan dat je dat niet wilt of gewoon dat niet bent? Omdat je kan!

Als u de relevante JS-bestanden met de extensie hernoemt .js.erb dan kun je de gebruiken asset_url helper in deze bestanden zoals:

var src = "<%= asset_url('photo.jpg') %>";

-1
2018-05-30 12:41