I'm attempting to use render html: to render raw html from a controller action:
class SomeController < ApplicationController
def raw_html
render html: '<html><body>Some body text</body></html>'
end
end
However, when I run this controller action, I get a "Template is missing" error
I don't want to use a template, just render raw html.
The error I get is:
Processing by SomeController#raw_html as HTML
Parameters: {}
ActionView::MissingTemplate (Missing template some_controller/raw_html
with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder,
:raw, :ruby]}. Searched in: *
"/Users/doved/source/sample_app/app/views" *
"/Users/doved/.rvm/gems/ruby-2.0.0-p353#syp/gems/chameleon-0.2.4/app/views"
* "/Users/doved/.rvm/gems/ruby-2.0.0-p353#syp/gems/kaminari-0.15.1/app/views"):
app/controllers/some_controller.rb:14:in raw_html'
lib/middleware/cors_middleware.rb:8:incall'
I'm using Rails 4.0.2
What am I doing wrong?
html option was added to render method in Rails 4.1 version.
Checkout the discussion on this topic on Github
If you upgrade the Rails version to Rails 4.1 then you would be able to render html as
def raw_html
render html: '<html><body>Some body text</body></html>'.html_safe ## Add html_safe
end
With the current version of Rails 4.0.2, you would need to use
def raw_html
render text: '<html><body>Some body text</body></html>'
end
You are getting error as: ActionView::MissingTemplate
Because currently html option is not supported by render so the value passed with html option is ignored and Rails starts to look for a template some_controller/raw_html in views directory.
Possible duplicate of
How to return HTML directly from a Rails controller?
This should work for you:
render text: '<html><body>Some body text</body></html>'
Related
I'm receiving a deprecation warning when running rails test. That warning being below. Any help is appreciated in identifying what I'm doing incorrectly.
(Edit: Side note, the render MUST break and return from the current controller call. I attempted to use ApplicationController.render(...) in place of the current render call, but that did not return from the controller call and I was receiving errors/warnings of :no_content rendered.)
Warning:
DEPRECATION WARNING: Rendering actions with '.' in the name is deprecated: actions/action_success.json (called from update at /<path>/app/controllers/table_base_controller.rb:39)
The code throwing the warning is specifically this call to render within a controller:
render('/actions/action_success.json', locals: {
view: action.lookup_view('default'),
action: action,
area: current_area,
account: current_account
})
I've tried taking off the .json as directed (also tried adding template: <path>, tried file: <path>), however, I receive this error in the test console:
Error:
TableControllerTest#test_Admin_should_update_via_loan_table:
ActionView::MissingTemplate: Missing template actions/action_success with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :jbuilder]}. Searched in:
* "/<path>/app/views"
app/controllers/table_base_controller.rb:39:in `update'
app/controllers/application_controller.rb:79:in `with_account'
test/controllers/table_controller_test.rb:14:in `block in <class:TableControllerTest>'
The file in question (path: app/views/actions/action_success.json.jbuilder):
# frozen_string_literal: true
json.status 'success'
json.status_code 200
json.messages action.messages
if view
json.result do
json.partial! view.to_s, result: action.result, locals: { area: area }
end
else
json.result action.result
end
Deprecating partial names that include a . was done to prevent ambiguity in parsing the partial name. We should explicitly state formats instead of including them in the partial name we pass to render.
Without the format in the string you pass in, you need to ensure the formats the render is expecting includes the format you're using, in this case json, which is not one of the default formats.
You can send it in as an option (and make the partial name an option as well) like this:
render(
partial: '/actions/action_success',
formats: [:json],
locals: {
view: action.lookup_view('default'),
action: action,
area: current_area,
account: current_account
}
)
I am working on a Rails app. I have a form where the user can submit some files. The form is doing an AJAX call (it has the remote: true attribute). Whenever I want to send a file using the "f.file_field :banner" helper, the server responds with
Missing template posts/update with {:locale=>[:fr], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :slim]}. Searched in: ...
I have tried to add a respond_to block into my controller but then the server throws an ActionController::UnknownFormat.
Why is it not rendering my JS template ONLY when I submit a file? The form works fine when I just submit text.
Thank you for you help!
EDIT:
My form:
= bootstrap_form_for #section, remote: true do |f|
= f.file_field :banner
...
My controller:
# PATCH/PUT /sections/1
def update
#section.update(section_params)
manage_photos
render "posts/update"
end
Solution:
Using the remotipart gem !
Your problem is specifically the line in your controller:
render "posts/update"
in your views directory, do you have a file posts/update.html.erb or the like. That is what it is trying to render. It can't find the file. What are you trying to do with that line?
UPDATE:
Try doing this:
render 'posts/update', formats: [:js]
I'm using Rails 3.2.21 with JBuilder.
I have an example where I'm using an a JBuilder partial inside of a js.erb file to pre populate some fields:
var orderData = <%= raw render :partial => 'orders/orders', formats: [:json], handlers: [:jbuilder], locals: {orders: #orders} %>;
I have a weird problem where if an error is thrown in the jbuilder template, it renders a missing template error. so
If _orders.json.jbuilder looks like this
json.array! orders do |order|
json.someProperty order.a_missing_property
end
I get this:
ActionView::Template::Error (Missing partial orders/orders with {:locale=>[:en], :formats=>[:js, :html], :handlers=>[:erb, :builder, :coffee, :haml, :jbuilder, :riif]}
But if there is no error, this renders properly.
Any idea how my error is getting swallowed?
Update
I've created a demo app here: https://github.com/earnold/error-demo
If you load home/index you get a missing template error. If you comment out the bad line in the template, you render the template normally. What I am trying to do is make sure that errors aren't swallowed, but instead are shown on the page.
I was able to get an answer on Github here: https://github.com/rails/jbuilder/issues/40
Short version: this can be remedied by monkey patching Rails. Put this in an initializer and you're good to go.
if Rails.env.development? || Rails.env.staging?
module ActionView
class Template
protected
def handle_render_error(view, e) #:nodoc:
if e.is_a?(Template::Error)
e.sub_template_of(self)
raise e
else
assigns = view.respond_to?(:assigns) ? view.assigns : {}
template = self
unless template.source
# If an error occurs while the Jbuilder template is being rendered in
# in a nested context, you have a mismatch between the template format
# and the view context. Therefore, this block of code would raise
# a false exception (ActionView::MissingTemplate) and swallow the original
# error. This monkey patch tricks rails into thinking it was a json request
# so that refreshing the source hits the right partial
if template.formats == [:json]
view.lookup_context.formats = [:json]
end
template = refresh(view)
template.encode!
end
raise Template::Error.new(template, assigns, e)
end
end
end
end
end
I have a problem when trying to render a controller action. Following the documentation I should be able to use:
render 'user/new' or
render template: 'user/new' or
render :action => "new", :controller => "users"
Although I get a template missing exception and I'm not shure, why. Using a form for works, but it's stupid to copy exactly the same form.
I'm pretty messed, so I'm shurely missing something, but I don't get it.
Any hints?
EDIT: I'm calling from the GroupsController where I want to render the new-user-form. Did a test with only scaffolded models and I get the same error.
ActionView::Template::Error (
Missing partial users/new with {:locale=>[:de], :formats=>[:html], :handlers=>[:erb, :builder, :coffee]}. Searched in:
* "/Users/rob/Development/projects/test/app/views"
* "/Users/rob/.rvm/gems/ruby-1.9.3-p362/gems/oembed_provider_engine-0.2.0/app/views"
* "/Users/rob/.rvm/gems/ruby-1.9.3-p362/gems/devise-2.2.3/app/views"
):
Partial templates' filename always begins with an underscore. So you need a "_new.html.erb" file in your "user" view to render.
If I'm not mistaken, the default scaffolding creates a "_form.html.erb" for each model to render it in new and edit actions both. You can just render that instead of the whole "new" view.
I'm trying to render my pagination links inside an ajax request with kaminari and im getting a server error. I'm using the render_to_string method to render the pagination links to a string then parse it via json. I'm using rails 3.1.0.
ActionView::Template::Error (Missing partial kaminari/paginator with {:handlers=>[:erb, :builder, :haml], :formats=>[:json], :locale=>[:en, :en]}. Searched in:
Basically it's looking for the partials in all my load paths and can't seem to find the files, and they're there for sure.
Has anyone experienced similar behavior and know of a possible reason?
I just ran into this as well. I was able to work around it by moving render_to_string into a respond_to block -
respond_to do |format|
format.js do
foo = render_to_string(:partial => 'some_kaminari_view').to_json
render :js => "$('#foo').html(#{foo})"
end
end
See here: http://whowish-programming.blogspot.com/2011/07/stupid-rails3-with-missing-template-and.html
Just append .html to your view name.