ActionView::MissingTemplate even though template exists - ruby-on-rails

I'm building a simple login screen. I'd like to return an :internal_server_error to my client if there isn't a matching user or if the password is incorrect. However, I'm getting the following missing template error:
ActionView::MissingTemplate (Missing template login/index,
application/index with {:locale=>[:en], :formats=>[:json],
:variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby,
:coffee, :jbuilder]}. Searched in: *
"C:/Shelf/myGroceryList/app/views"
What has me confused is that I have an index.html.erb template in views/login. Thoughts?
Route:
post '/login', to: 'login#show'
Controller(login_controller.rb):
class LoginController < ApplicationController
protect_from_forgery with: :null_session
def index
end
def show
username = params.values.last["email"]
password = params.values.last["password"]
loginType = params.values.last["loginType"]
if loginType == "Login"
login(username, password)
else
createNewUser(username, password)
end
end
def login(username, password)
begin
user = User.find_by(username: username)
raise(StandardError) if user.password != password
rescue
render 'index', :status => :internal_server_error
end
end
def createNewUser(username, password)
User.new(username: username, password: password)
end
end
View(index.html.erb):
<body><%= javascript_pack_tag 'login' %></body>

ActionView::MissingTemplate (Missing template login/index,
application/index with {:locale=>[:en], :formats=>[:json],
:variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby,
:coffee, :jbuilder]}. Searched in: *
"C:/Shelf/myGroceryList/app/views"
The error says it can't find the file with the name index and with the format json. As are you having an API, probably the request/response would be in the format json not html. That said you need to create a index.json.erb inside app/views/login to resolve the error.

Related

ActionView::MissingTemplate (Missing template layouts/base_mailer

I want to have confirmation mailer, which user receive it after finished his process. I split it into two classes - BaseMailer and ConfirmationMailer < BaseMailer. I was trying to call it in the rails console but I've received an error:
ActionView::MissingTemplate (Missing template layouts/base_mailer with {:locale=>[:en, :de], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :coffee, :jbuilder]}. Searched in:)
Code below:
BaseMailer
class BaseMailer < ApplicationMailer
layout 'base_mailer'
default from: "testing#test.com"
end
ConfirmationMailer
class ConfirmationMailer < BaseMailer
layout 'base_mailer'
def send_email(to_email, cc_email)
mail_headers = headers(to_email, cc_email)
mail(mail_headers)
end
private
def headers(to_email, cc_email)
{
to: to_email,
cc: cc_email,
reply_to: to_email,
subject: 'testing title',
}
end
end
Structure of my views:
views
|__base_mailer
| |___welcome.html.erb
|
|__confirmation_mailer
|___send_email.html.erb
You forgot to create app/views/layouts/base_mailer.html.erb

ruby on rails - reset password - override

I am using ruby on rails version 4.2.4 and devise 4.0.0
I have problems with reset password and I am trying to override and reset to the new password by overriding devise myself. Now that I have the code to change password, i need to complete the "update" function.
Below is my code to override Devise::PasswordsController
in route.rb:
devise_for :users, controllers: { passwords: 'users/passwords' }
in controller/users/password_controller.rb
class Users::PasswordsController < Devise::PasswordsController
def create
super
puts "create PasswordsController"
end
def new
super
puts "new PasswordsController"
end
def update
reset_password_token_hash = Devise.token_generator.digest(self, :reset_password_token, resource_params['reset_password_token'])
user = User.find_by_reset_password_token(reset_password_token_hash)
user.update(password: resource_params['password'])
#xxxx respond_with resource, needs to do something like this ??
end
def edit
super
puts "edit PasswordsController"
end
end
it manage to change password but has problem with the page:
Completed 500 Internal Server Error in 176ms (ActiveRecord: 13.0ms)
ActionView::MissingTemplate - Missing template users/passwords/update, users/passwords/update, devise/passwords/update, devise/update, application/update with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :slim, :jbuilder]}. Searched in:
* "/Users/megasap/Documents/project/harta.org/harta.org-backend/app/views"
* "/Library/Ruby/Gems/2.3.0/gems/ckeditor-4.2.2/app/views"
* "/Library/Ruby/Gems/2.3.0/gems/grape-swagger-rails-0.2.0/app/views"
* "/Library/Ruby/Gems/2.3.0/gems/devise-4.0.0/app/views"
Can someone let me know how to complete the "update" method for Users::PasswordsController

Rails error finding actionmailer template despite email sending correctly

I have a rails app running on passenger with a mailer. I have it so the page following the action shows the email content but I get this error:
Missing template rfis/mail, application/mail with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :slim, :jbuilder]}. Searched in: * "/var/www/rqm3/app/views" * "/usr/local/rvm/gems/ruby-2.1.5/gems/devise-3.5.1/app/views" * "/usr/local/rvm/gems/ruby-2.1.5/gems/twitter-bootstrap-rails-3.2.0/app/views"
despite this, the email does correctly load the template when being sent. It's only showing it in a view that causes issues.
rfis_controller.rb:
def mail
#mail_message = RfiMailer.send_rfi(current_user, #rfi).deliver
end
rfi_mailer.rb:
class RfiMailer < ApplicationMailer
default from:"testemail#mail.com"
def send_rfi(user, rfi)
mail(to:"other#test.com")
end
end
send_rfi.html.erb:
test
Issue is due to you are not redirecting anything inside your method "mail" define inside controller
def mail
#mail_message = RfiMailer.send_rfi(current_user, #rfi).deliver
redirect_to #user, notice: "Message sent successfully ."
end
you can also define render nothing

Rails respond with JBuilder (AngularJS)

i have a simple application to snooker league and i have a action add_player in LeaguesController. My client (AngularJS) call this action and i want to respond with json format using JBuilder. This working fine:
def add_player
...
render :json => #league.players.to_json(:only => [ :id, :firstname, :lastname, :max_break, :email ])
end
But when i delete this line and add:
respond_to do |format|
format.html
format.json
end
i have this error:
ActionView::MissingTemplate (
Missing template leagues/add_player,
application/add_player
with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :jbuilder, :haml]}.
Searched in:
* "/home/daniel/SitesWWW/snookerLeague/app/views"
):
app/controllers/leagues_controller.rb:67:in `add_player'
Of course i have file add_player.json.jbuilder:
json.players #league.players do |player|
json.id player.id
json.firstname player.firstname.capitalize if player.firstname
json.lastname player.lastname.capitalize if player.lastname
json.email player.email
json.max_break player.max_break
end
So, what i should do?
Notice in your error message :formats=>[:html] this indicates to me it is trying to render add_player.html.erb and not your jbuilder template.
To verify this, try changing the calling code and append .json to the url which will force the format to be json.
You can also specify a default of json on your routes and not include it in the url:
resources :leagues, defaults: { format: :json } do
member do
post :add_player
end
end
see also: http://guides.rubyonrails.org/routing.html#defining-defaults

where to store a jbuilder template?

I'm attempting to use a jbuilder template.
Given the controller,
class Api::ReviewsController < ApplicationController
before_filter :authenticate_user!
respond_to :json
def create
#review_request = ReviewRequest.new(review_request_params.merge(user_id: current_user.id))
if #review_request.save
render 'review_requests/review'
else
head :forbidden
end
end
end
and I have the jbuilder template stored at app/views/review_requests/review.json.jbuilder
json.review_request do
json.(#review_request, :title,)
end
I'm getting a template note found error.
ActionView::MissingTemplate (Missing template review_requests/review with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :jbuilder]}. Searched in:
* "/Users/jd/Dropbox/application-code/antipattern/app/views"
* "/Users/jd/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/devise-3.4.1/app/views"
* "/Users/jd/Dropbox/application-code/antipattern"
* "/"
):
app/controllers/api/reviews_controller.rb:8:in `create'
Any thoughts on either where the correct place to store this template is or why rails isn't finding the template i'm using (if the storage location happens to be ok)?
jbuilder needs a json type web request, an html request to a rails server will cause the jbuilder template to not be rendered.

Resources