Missing template action error in rails3 - ruby-on-rails

I have defined a method in controller that is like:
def self.dailymail
.... #fill data from db
ac = ActionController::Base.new()
kit = PDFKit.new(ac.render_to_string(:action => "formatinhtml.html.erb",:rawdata => data))
pdf = kit.to_pdf
... #send pdf in mail
end
formatinhtml is like:
def formatinhtml
#dailyrep = params[:rawdata]
respond_to do |format|
format.html # daily.html.erb
end
end
I have to use self.dailymail so that I can call it from model & in turn from rufus scheduler.But,still I get error such as:
scheduler caught exception:
Missing template action_controller/base/daily.html with {:locale=>[:en], :formats=>[:html, :text, :js, :css, :ics, :csv, :png, :jpeg, :gif, :bmp, :tiff, :mpeg, :xml, :rss, :atom, :yaml, :multipart_form, :url_encoded_form, :json, :pdf, :zip, :xls], :handlers=>[:erb, :builder, :coffee]}. Searched in:
* "F:/DEVELOPMENT/TrackIt/app/views"
C:/Ruby193/lib/ruby/gems/1.9.1/gems/actionpack-3.2.8/lib/action_view/path_set.rb:58:in `find'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/actionpack-3.2.8/lib/action_view/lookup_context.rb:109:in `find'...
so,what does I need to do?
Update: After debugging,I found action formatinhtml is not actually being getting called;I have defined neccessary routes.

Your folder where "daily.html" is located is not the same as your controller

Related

Ruby On Rails - Pass parameters from front end to database through controllers

How to pass parameters from front end to back-end API in Ruby on Rails only through controllers? I do not want to use model or views for this.
I am using a Ruby Gem which captures some usage data which needs to be stored into the back end database.
I have created a controller, to which the post parameters are sent, but I get an error saying view is not found.
ActionView::MissingTemplate (Missing template usage_metrics/create, application/create with {:locale=>[:en], :formats=>[:json, :js, :html, :text, :js, :css, :ics, :csv, :vcf, :png, :jpeg, :gif, :bmp, :tiff, :mpeg, :xml, :rss, :atom, :yaml, :multipart_form, :url_encoded_form, :json, :pdf, :zip, :web_console_v2], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :jbuilder]}. Searched in:
* "/home/local/www/cc2/cc_user-frontend/app/views"
* "/home/local/.rvm/gems/ruby-2.2.3/gems/ckeditor-4.2.2/app/views"
):
You need to send the request in an appropriate format (i.e. json) and ensure the controller action responds to this. At the moment it's trying to respond with html but not finding a template for this.
For example, in the action, after you've done what you need to do:
respond_to do |format|
format.json { render json: { whatever: is_needed_in_the_response } }
end
And you'll get your response that way.
Or if you don't need a response after parsing the params, you can use render nothing: true.
N.B. I think the newest versions Rails will respond with nothing / json if there's no template found. Not sure how this affects you.
Hope that helps!
if you want to return some data as json you can use
render json: data
but if you only want to return status
render json: {}, status: 200

How to setup api controller without the API version of Rails

I'm using Rails 5 to create an API but can not use the Rail 5 API only mode as I need Devise for user auth. Here's is how I have my first API controller setup:
routes.rb
Rails.application.routes.draw do
namespace :api do
namespace :v1 do
resources :skills
end
end
get '/*path' => 'home#index'
end
/controllers/api_controller.rb
class ApiController < ActionController::API
end
/controllers/api/v1/skills_controller.rb
class SkillsController < ApiController
def index
#skills = Skill.all
json_response(#todos)
end
def json_response(object, status = :ok)
render json: object, status: status
end
end
When I go to test this in the browser like so: http://localhost:4300/api/v1/skills.json
I'm getting the following errors in the rails log:
Started GET "/api/v1/skills.json" for 127.0.0.1 at 2017-05-25 08:44:12 -0700
TypeError (superclass mismatch for class SkillsController):
app/controllers/api/v1/skills_controller.rb:1:in `<top (required)>'
Error during failsafe response: superclass mismatch for class SkillsController
ActionView::MissingTemplate (Missing template public/index.html with {:locale=>[:en], :formats=>[:html, :text, :js, :css, :ics, :csv, :vcf, :png, :jpeg, :gif, :bmp, :tiff, :svg, :mpeg, :xml, :rss, :atom, :yaml, :multipart_form, :url_encoded_form, :json, :pdf, :zip, :gzip], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby]}. Searched in:
How can I set this up to work?
Set up your controller like this:
# /controllers/api/v1/skills_controller.rb
class Api::V1::SkillsController < ApplicationController
# fill in the rest
end

Rails Template is missing render json

actually i use rails for my REST API, and i need transform my object to json but when i try i got this error:
<h1>Template is missing</h1>
<p>Missing template firms/show, application/show with {:locale=>[:en], :formats=>[:html, :text, :js, :css, :ics, :csv, :png, :jpeg, :gif, :bmp, :tiff, :mpeg, :xml, :rss, :atom, :yaml, :multipart_form, :url_encoded_form, :json, :pdf, :zip], :handlers=>[:erb, :builder, :arb, :jbuilder]}. Searched in:
* "/Users/allan/Desktop/Work/back/app/views"
* "/Library/Ruby/Gems/2.0.0/gems/activeadmin-0.6.0/app/views"
* "/Library/Ruby/Gems/2.0.0/gems/kaminari-0.16.3/app/views"
* "/Library/Ruby/Gems/2.0.0/gems/devise_invitable-1.5.5/app/views"
* "/Library/Ruby/Gems/2.0.0/gems/devise-3.5.4/app/views"
</p>
This is my code
def show
firm= Firm.find_by_subdomain(params[:subdomain])
if firm.present?
respond_to do |format|
#firm = firm
format.json { render :json => #firm.to_json }
end
end
end
I hope someone here can help me :)
Solve:
def show
render json: Firm.find_by_subdomain(current_subdomain)
end
thank you
Template missing means that you asking for a html view, not doing a json request.
If you want to always return json format regardless of format param, do this:
before_action :set_default_response_format
protected
def set_default_response_format
request.format = :json
end
#source: Rails 4 - How to render JSON regardless of requested format?
Try to add .json at the end of you query when querying your route. Without this, it will try to render html and it will go search for view file that might not be present in your case.

What is the `.html` used in ruby on rails?

I see lots of code snippets that goes:
respond_to do |format|
format.html { something }
format.json { something }
end
I'm wondering what the html and json are in the above code snippet. Are they methods? Scopes? Attributes?
Let's investigate, shall we? This is implementation of respond_to:
def respond_to(*mimes)
raise ArgumentError, "respond_to takes either types or a block, never both" if mimes.any? && block_given?
collector = Collector.new(mimes, request.variant)
yield collector if block_given?
if format = collector.negotiate_format(request)
_process_format(format)
_set_rendered_content_type format
response = collector.response
response ? response.call : render({})
else
raise ActionController::UnknownFormat
end
end
(the documentation is quite thorough, by the way. Check it out.)
We see that it yields some Collector to the block (which you refer to as format). Here it is: https://github.com/rails/rails/blob/0e70595acc8796c3e0854ef72df478d597243e68/actionpack/lib/abstract_controller/collector.rb
We see that it just enumerates all Mime content types and generates (dynamically) methods for them. Oh and JFYI, here are all the possible things you can respond_to:
Mime::SET.map(&:symbol)
=> [:html,
:text,
:js,
:css,
:ics,
:csv,
:vcf,
:png,
:jpeg,
:gif,
:bmp,
:tiff,
:mpeg,
:xml,
:rss,
:atom,
:yaml,
:multipart_form,
:url_encoded_form,
:json,
:pdf,
:zip,
:doc,
:excel]

getting ActionView::MissingTemplate

i have a method called def createCustomer so i created a .html.erb file called createCustomer within the folder name charge which is the name of the controller. This charge folder is in under the views folder.
i am getting this on my logs
ActionView::MissingTemplate (Missing template charge/createCustomer, application/createCustomer with {:locale=>[:en], :formats=>[:html, :text, :js, :css, :ics, :csv, :vcf, :png, :jpeg, :gif, :bmp, :tiff, :mpeg, :xml, :rss, :atom, :yaml, :multipart_form, :url_encoded_form, :json, :pdf, :zip], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :jbuilder]}. Searched in: 2016-01-26T23:00:34.324498+00:00 app[web.1]: * "/app/app/views"
To add to the comments, you need to equate yourself with the Rails infrastructure (convention over configuration):
Class names are CamelCase, file names are snake_case
Controllers are plural (mostly)
You should keep your controllers resourceful
Here's how it should be structured:
# config/routes.rb
resources :customers #-> url.com/customers/new
# app/controllers/customers_controller.rb
class CustomersController < ApplicationController
def new
#customer = Customer.new
end
def create
#customer = Customer.new customer_params
redirect_to #customer if #customer.save
end
private
def customer_params
params.require(:customer).permit(...)
end
end
# app/views/customers/new.html.erb
<%= form_for #customer do |f| %>
...

Resources