How can I render an image with Padrino? - ruby

I need to create image files on-the-fly in my controller with RMagick and send them to browser. Looks like it's very simple, but I can't find a way. I've tried just simply render them, but it fails due to data is binary. I've also tried to use send_data, but Padrino says it doesn't know about such method.
So, what have I missed? How can I solve this problem?

Researching how to send files through Padrino controller I've found this question and it helps me to reach my goal.
The send_data method is a Sinatra request-method which has been removed in the version 1.0: https://github.com/sinatra/sinatra/blob/1.0/CHANGES#L108
I'm using the Padrino version 0.10.7 and my action have became into this:
get :screenshot, :provides => :jpg do
...
File.open("path/to/file", "r").readlines
end

according to sinatra api you don't need this anymore.
get :image, with: id, provides: :png do
img = Image.find(params[:id])
img.binary_data_or_so
end
basically is the same of:
get '/send_binarydata' do
content_type 'image/png'
\x01\x02\x03
end

Related

Unable to route in ruby on rails as I encounter specific error

I'm using rails 5.0 and I get the
PostsController#index is missing a template for this request format and variant. request.formats: ["text/html"] request.variant: []
NOTE! For XHR/Ajax or API requests while trying to input my url/posts.
my routing.rb file is below:
Rails.application.routes.draw do
get 'posts/index' => 'posts#index'
resources: posts
end
my posts_controller.rb looks like below:
class PostsController < ApplicationController
def index
end
end
I want to know specifically what I'm doing wrong. I've just started to learning Ruby on Rails.
Template is missing. You need to create a file ie index.html.erb under directory /app/views/posts/index.html
GET profiles/employees- Should display all the employees
GET profiles/employees/:id should display a specfic employee
GET profiles/donors - Should display all the donors
GET profiles/donors/:id - Should display a specfic donor
routes in ruby on rails behave in the same way as href tag in rails
we use get for link and if we want toi perform any action on button then w e have to use button.
if you have any doubt let me know in detail.
for more details refer this
http://guides.rubyonrails.org/routing.html
if we write only localhost:3000/employees then bydefault our application will redirect to index page.
The issue is template missing you are missing the template file index.html.erb
I have notice that on your snapshot you named the template file as index.html.erb.txt
remove the .txt and rename to index.html.erb Then it should work
Also you don't need to declare the routes as
get 'posts/index' => 'posts#index'
Just declare the resources: posts is enough. You may check the routes using the rake routes command on your rails console
Rename the file index.html.erb.txt to index.html.erb

rails-opal and opal ujs on remote: true

I use rails-opal, opal-jquery gems, also require opal-ujs in application.js.rb, BUT on for example link_to "Foo", some_path, remote:true if I render e.g. remote_reply.js.rb layout:false with puts HI that code is not executed on client. If I send remote_reply.js with alert('foo'); all works fine? Is this only my problem, or such thing is unsupported? p.s. everywhere else opal works fine.
If someone will face that issue: you should render js file with .opal extension like remote_reply.js.opal and that will do.

Why is Padrino trying to use a template when rendering a json response?

I have adopted a padrino application [repo], and am looking to move all the data into a json returned ajax call. From googling around I've seen:
Padrino model from json data
http://www.padrinorb.com/guides/controllers#provides-formats
So I created this method/response to try and start moving the data to a separate response:
get :data, provides: :json do
#records = Record.order(:day).all
render #records, layout: false
end
This results in a template not found error:
Padrino::Rendering::TemplateNotFound at /data.json
Template '#<Record:0x007fd19decdeb8>' not found in '~/Developer/Ruby/arewesmallyet/app/views'
and
Padrino::Rendering::TemplateNotFound at /data
Template '#<Record:0x007fd19decdeb8>' not found in '~/Developer/Ruby/arewesmallyet/app/views'
which doesn't make sense, obviously I don't want to use a template here, so what am I missing?
So I got it to work by replacing render #records, layout: false with #records.to_json.
Pretty sure that's not how it's supposed to work, so if anyone knows a better way I'm all ears, otherwise I'll accept this answer.

Render a view's output later via a delayed_job

If I render html I get html to the browser which works great. However, how can I get a route's response (the html) when being called in a module or class.
I need to do this because I'm sending documents to DocRaptor and rather than store the markup/html in a db column I would like to instead store record IDs and create the markup when the job executes.
A possible solution is using Ruby's HTTP library, Httparty or wget or something and open up the route and use the response.body. Before doing so I thought I'd ask around.
Thanks!
-- Update --
Here's something like what I ended up going with:
Quick tip - in case anyone does this and need their helper methods you need to extend AV with ApplicationHelper:
Here's something like what I ended up doing:
av = ActionView::Base.new()
av.view_paths = ActionController::Base.view_paths
av.extend ApplicationHelper #or any other helpers your template may need
body = av.render(:template => "orders/receipt.html.erb",:locals => {:order => order})
Link:
http://www.rigelgroupllc.com/blog/2011/09/22/render-rails3-views-outside-of-your-controllers/
check this question out, it contains the code probably want in an answer:
Rails 3 > Rendering views in rake task

Creating a plist in Rails 3

I'm new to Rails and I'm trying to learn it using Rails 3 (RC).
I have managed to use http://plist.rubyforge.org/ for supporting the output of plists. I would like to check with you guys to see if my approach is the right way to do it. Here goes:
In the gemfile I added gem 'plist'
In config/initializers/mime_types.rb I added Mime::Type.register "application/plist", :plist
In the controller, I added format.plist { render :plist => #product } in show
In the model, I added
def to_plist
attributes.to_plist
end
And finally, in the view file show.plist.erb, I have <%= raw #product.to_plist %>
Accessing for instance /products/2.plist works fine, but being new to Rails, I'm wondering if there are anything I should have done differently.
Looks right to me.
The only suggestion I have is to perhaps mix in the to_plist method into ActiveRecord::Base so that you don't have to define it over and over in each model. Perhaps this method will even support render_with syntax?
I'm about to do something similar myself.

Resources