Rails 4 image_path('image.jpg') displays image path instead of actual image. - image

Running Rails 4 and deployed to Heroku and have been struggling with a strange issue.
Config contains:
config.assets.compile = true
Gemfile contains:
gem 'rails_12factor', group: :production
Have a line in my application.html.erb to render an image:
<%= image_path('image.jpg') %>
Placed my image in the following locations (excessive but troubleshooting):
assets
assets/images
public
public/images
I am compiling assets during my deployment to Heroku (slug compilation) and no errors are returned.
When I open the webpage the image is not rendered and instead the path is provided as:
"/images/image.jpg"
Any thoughts as to why this is occurring?
Thank you all in advanced

That is the expected behaviour for image_path. I think what you're looking for is image_tag.
For example, if your image is assets/images/image.png to render it in the view you would use:
<%= image_tag('image.png') %>
That is the recommended method, but you could also do
<img src="<%= image_path('image.png')%>" />

Related

Rails 6.1.1 doesn't load the webpacker created CSS files in production mode

this is my first time asking a question here, I hope I would explain my problem well.
In one of my recent tasks, I'm upgrading our app to Ruby and Rails (Ruby 2.6.6 > 2.7.2, Rails 6.0.3.2. > 6.1.1)
I had several issues along the way, upgraded some gems and JS libraries. The application runs fine in development mode. However when I switch to production mode, I run these commands to compile and run the server.
RAILS_ENV=production bundle exec rake webpacker:compile
./node_modules/webpack/bin/webpack.js --config webpack.config.js
When I run the app, in production mode it looks running normal, but when I go to localhost:3000 it throws several 500 errors regarding to CSS files. I see the main page of the app as plain HTML, without CSS.
2021-01-22 11:50:51 -0500 Rack app ("GET /assets/stylesheets/app-styles-3661efb317da3fb28f52.css" - (127.0.0.1)): #<NoMethodError: undefined method `match?' for #<ActionDispatch::FileHandler:0x00007ff610502c20>>
2021-01-22 11:50:25 -0500 Rack app ("GET /assets/landing.debug-05588bd014e46c264aaf6e00d2f5c570dd7ca3ed42336c2ff6d5c05bf986afe2.js" - (127.0.0.1)): #<NoMethodError: undefined method `match?' for #<ActionDispatch::FileHandler:0x00007ff610502c20>>
2021-01-22 11:50:25 -0500 Rack app ("GET /assets/companyLogo-6700adf796812269b9428251803c253b9c073095ef511d3619d269a0fdd96435.png" - (127.0.0.1)): #<NoMethodError: undefined method `match?' for #<ActionDispatch::FileHandler:0x00007ff610502c20>>
Files which are mentioned in the error are exists under the /public folder. In the browser's page source, I can see the path as well. When I click the folder path on page source, I see this error on the browser.
An unhandled lowlevel error occurred. The application logs may have details.
When I check the docs of RoR, the match? method for ActionDispatch::FileHandler is not there, but in 6.0.3.2 docs, it is deprecated without a notice, maybe.?. It is not something I call intentionally, it is probably called somewhere in Rails when the app is running on production mode.
I have those helper in my erb files.
<%= javascript_pack_tag 'application' %>
<%= stylesheet_pack_tag 'application' %>
I tried replacing them with
<%= stylesheet_pack_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
but no luck :(
I tried this as well.
Is anyone have an idea how can I make sure Rails is loading these files and accessible in the user side? Or any better debugging suggestions are appreciated!
Thanks in advance!
Note: When I switch to development mode, everything works fine.
BTW, Some Packages I use:
"#rails/webpacker": "5.2.1" #-> was 4.0.2
"webpack-bundle-analyzer": "3.3.2"
"webpack-manifest-plugin": "3.0.0-rc.0" #-> was 2.0.4
"webpack-cli": "4.4.0", #-> was 3.3.0 and it was only devDependency
We had the same issue with the match? method missing for ActionDispatch::FileHandler
We traced it back to: https://github.com/romanbsd/heroku-deflater/issues/54
Removing the heroku-deflater gem fixed it for us
If you have issues with this and get a error like this:
ActionView::Template::Error (Webpacker can't find application.css in /webapp/public/packs/manifest.json. Possible causes:
1. You want to set webpacker.yml value of compile to true for your environment
unless you are using the `webpack -w` or the webpack-dev-server.
2. webpack has not yet re-run to reflect updates.
3. You have misconfigured Webpacker's config/webpacker.yml file.
4. Your webpack configuration is not creating a manifest.
Your manifest contains:
{
"application.js": "/packs/js/application-26b24ac7b08f8a1b640f.js",
"application.js.map": "/packs/js/application-26b24ac7b08f8a1b640f.js.map",
"entrypoints": {
"application": {
"js": [
"/packs/js/application-26b24ac7b08f8a1b640f.js"
],
"js.map": [
"/packs/js/application-26b24ac7b08f8a1b640f.js.map"
]
},
}
):
You can resolve it by deleting the stylesheet_pack_tag in app/views/layouts/application.html.erb. The javascript_pack_tag directive loads the scss/css.
You can see in the error message entrypoints that the scss was not generated, its inside the js. I've self inflicted this error on me because of outdated guides.
Example
With the following files & contents:
app/javascript/packs/application.js
// rails generated stuff
import "styles/application.scss"
app/javascript/styles/application.scss
// some scss rules
body { background-color: red; }
app/views/layouts/application.html.erb:
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>

The asset "application.js" is not present in the asset pipeline in Rails 6

I am creating a RoR-6 app and I get the following error thrown from application.html.erb file from this line:
javascript_include_tag 'application', 'data-turbolinks-track': 'reload'
I get the following error:
ActionView::Template::Error: The asset "application.js" is not present in the asset pipeline.
The app was created by running rails new myapp -d postgres
I am using rails 6.0.0.rc1
You'll want to use javascript_pack_tag instead of javascript_include_tag:
javascript_pack_tag 'application', 'data-turbolinks-track': 'reload'
This is required because webpacker handles javascript compilation in Rails 6.
If you do not want to use Webpack, add the following to config/initializers/assets.rb:
Rails.application.config.assets.precompile += %w(application.js)
Place this line in the application.html.erb:
<%= javascript_pack_tag 'application' %>
This worked on my end.
Running yarn build solved the issue for me (which in the first place was caused by running rails assets:clobber)

Rails wicked_pdf, convert page as pdf

I have a normal Rails layout which is my normal Site.
I want a Button on this page to convert/transform this page into
a PDF file.
I want to do it with this gem:
https://github.com/mileszs/wicked_pdf
I added gem 'wicked_pdf' to my Gemfile, but now how can I convert the actual page?
Here's what I did to use wicked_pdf:
# Gemfile
gem 'wicked_pdf'
gem 'wkhtmltopdf-binary' # if you need the binary too
Then run
$ bundle install
$ (bundle exec) rails g wicked_pdf # generates the initializer
Then you can configure global settings in config/initializers/wicked_pdf.rb as stated in the wicked readme on github.
Rails 4 already knows the pdf mime type, but in older versions you'll probably need to register pdf as a mime type:
# config/initializers/mime_types.rb
Mime::Type.register "application/pdf", :pdf
In your controller
respond_to do |format|
format.html
format.pdf do
render pdf: "your-filename"
end
end
Then you put a view under app/views/<your-view>/<controller-action>.pdf.erb with the content you wan't.
To reference this by a link you can do something like:
= link_to "Get PDF", your_path(format: :pdf)
Does this solve your question?
Please follow the below link. Its a details tutorial, this will make your life easier:
http://dchua.com/2014/10/30/generate-pdfs-with-html-templates-in-rails/
Note
If you don't want to have your pdf views separately and want to use the same html view, then please use
template: invoices/show.html.erb
instead of
template: invoices/show.pdf.erb

Render SASS files correctly in File.read (inside PDF file)

I generate a pdf and have to include css in the generated file so that the styling is correct in the pdf. To do this I have
<%= File.read(Rails.root.join("app", "assets", "stylesheets", "application.css.scss")) %>
<%= File.read(Rails.root.join("app", "assets", "stylesheets", "app.css.scss")) %>
But the sass isn't templated correctly. Does anyone know what the correct code to render the files right are?
replace File.read with
YourApp::Application.assets["application.css.scss"].to_s.html_safe
where YourApp is the name of the application you are working on. This will cause rails to render the scss inline.

Can't get asset pipeline working

I can't get the asset pipeline working for some reason. I get a 404 on request to both application.css and application.js. I'm using rails 3.1.0.rc6. Nothing special, just created a new project.
In my layout file:
<%= stylesheet_link_tag "application" %>
<%= javascript_include_tag "application" %>
It's linking to /stylesheets/application.css and same with the js file. I'm using pow but also tried starting the server with webrick.
Any ideas?
Note: using sprockets 2.0.0.beta.15
Figured it out. I had to make an explicit require call to "sprockets/railtie"
You might find that adding
config.serve_static_assets = true
to your config/environments/xxx.rb will help.
To be more exact, add this to your Gemfile
gem 'sprockets/railtie'

Resources