I've created a partial for use in my CMS page at:
/app/views/users/_register_home_page.html.haml
My CMS page looks like this:
{{ cms:partial:/users/register_home_page }}
When I call this from the browser (ie, Chrome) it works fine. Also when I go incognito (to ensure there's no cookies being sent)
calling my test page from curl:
curl "http://localhost:5000/test"
returns
ActionView::MissingTemplate at /
================================
> Missing partial users/_register_home_page with {:locale=>[:en], :formats=>[:all], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :haml]}. Searched in:
* "/Users/doug/dev/my-rails-app/app/views"
actionview (4.1.7) lib/action_view/path_set.rb, line 46
-------------------------------------------------------
41 end
42 METHOD
43 end
44
45 def find(*args)
> 46 find_all(*args).first || raise(MissingTemplate.new(self, *args))
47 end
48
49 def find_all(path, prefixes = [], *args)
50 prefixes = [prefixes] if String === prefixes
51 prefixes.each do |prefix|
I'd expect curl to return the same results.
Update: The error occurs when Accept: text/html is ommitted from the curl statement.
My solution for now was to modify the CMS gem to explicitly use :formats => [:html] in the partial tag, and then specify the full path (including html.haml) of the partial like so:
{{ cms:partial:/users/register_home_page.html.haml }}
A branch where this fix is here:
https://github.com/mvcodeclub/comfortable-mexican-sofa
I've also filed a Github issue
Related
I have a view in the LoginController with the following code
def home
render 'home'
end
However, whenever I load my web server, it shows the error message:
ActionView::MissingTemplate (Missing template login/home, application/home with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :jbuilder]}. Searched in:
* "C:/Users/60984/prairielearn-eecs/app/views"
* "C:/Ruby30/lib/ruby/gems/3.0.0/gems/actiontext-6.1.7.2/app/views"
* "C:/Ruby30/lib/ruby/gems/3.0.0/gems/actionmailbox-6.1.7.2/app/views"
):
app/controllers/login_controller.rb:16:in `home'
Even though I have the file in the directory app/views/login/home.html.erb.
I tried changing it to a more specific directory such as
def home
render 'login/home'
end
but it still fails. However, I tried using the whole path like
render file: 'C:/Users/.../app/views/login/home.html.erb'
With the code above, the problem changed into the html.erb is not being interpreted, it will display the code blocks on the browser no matter what browser I use.
I am just confused about why it doesn’t work since I have the html file in the designated place.
I'm writing a gem and I need that the app that use the gem could render a partial using = render "user_role_select" from the layout/application.html.haml.
My _user_role_select.html.haml lives in the gem at the path app/views/gem_name/. When I'm calling the render I'm getting the followed message:
Missing template /user_role_select with {:locale=>[:en],
:formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html,
:builder, :ruby, :haml]}. Searched in: * "/ruby-app/app/views" *
"/bundle/gems/bootstrap-kaminari-views-0.0.5/app/views" *
"/bundle/gems/kaminari-core-1.0.1/app/views" * "/ruby-app" * "/"
I'm noticed that the kaminari folder for example is included in the folders in which rails search so I'm guessing this is possible, but even looking in them source code I couldn't find any hint.
Ajax is used for Bootstrap modal call. The js.erb file is called successfully and this js.erb file then should load html.erb residing in the same subdir as the js.erb is under biz_workflowz/app/views/application/. Here is the js.erb file:
$("#newworkflow .modal-content").html('<%= j render(:file => "/biz_workflowx/application/event_action.html.erb") %>');
$("#newworkflow").modal();
However the event_action.html.erb is never found. The error is raised in action_view/path_sets.rb:
def find(*args)
find_all(*args).first || raise(MissingTemplate.new(self, *args)) #find_all(*args).first returns NIL
end
The error is:
ActionView::Template::Error (Missing template c:/d/code/rails_proj/engines/biz_workflowx/app/views/application/event_action.html.erb with {:locale=>[:en], :formats=>[:js, :html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee]}. Searched in:
.......
* "C:/D/code/rails_proj/engines/biz_workflowx/app/views" #<<== did search the subdir but did not find anything
* "C:/D/code/rails_proj/engines/searchx/app/views"
* "C:/D/code/rails_proj/engines/commonx/app/views"
* "C:/D/code/rails_proj/engines/authentify/app/views"
* "C:/D/code/rails_proj/webportal"
* "C:/"
):
1: $("#newworkflow .modal-content").html('<%= j render(:file => "biz_workflowx/application/event_action.html.erb") %>');
2: $("#newworkflow").modal();
actionview (4.2.0) lib/action_view/path_set.rb:46:in `find'
Even with hardcoded path to the file event_action.html.erb, it still returns template missing. The similar js.erb code has been used in a few places for ajax call and I does not see why here it does not work. What could cause this error?
Updated
Here is the debug windows showing the biz_workflowz/app/views has been searched by resolver which does not see the file under /application/. Strange!
add event_action.html.erb file under c:/d/code/rails_proj/engines/biz_workflowx/app/views/application
We just secured our application with an SSL certificate. Moving to HTTPS is proved more complex than we thought and we're currently sorting through a few of the resulting bugs.
We have an AJAX call in CoffeeScript, where rails responds by rendering the html of a partial. This is working perfectly in development.
CoffeeScript:
coffee_method: (pos, uid) =>
$.ajax '/contoller/test/',
type: 'POST'
data:
pos: pos
uid: uid
success: (data) ->
$('#result-div').html(data) #Populates side menu with _next_destination_menu content
error: ->
alert 'How embarassing! Something went wrong - please try your search again. '
Controller:
def test
... #do some stuff
puts "format requested: #{request.format}"
puts "format url_encodeded: #{request.format.url_encoded_form?}"
render partial: 'trips/_test' #app/views/trips/_test.html.erb
end
However, in production, we get the following error:
ActionView::MissingTemplate (Missing partial trips/_test with {:locale=>[:en], :formats=>[:url_encoded_form], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :jbuilder]}.
After some digging, I figured out the request in production was a different format. Using those puts lines in the controller to debug, here are the results:
Production:
format requested: application/x-www-form-urlencoded
format url_encodeded: true
Development:
format requested: */*
format url_encodeded: false
What is the best way to handle this issue. Do I:
Change the content type of every AJAX call in the CoffeeScript?
Add a respond_to...format.url_encoded_form {render partial: trips/test} to the controller?
The latter seems like I would be duplicating code, because I want to render the same partial, regardless of the format the request comes in. I tried format.all {...} but encountered the same issue. Any best practices are appreciated!
Update:
Specifying the response type directly gives me the same missing template error:
respond_to do |format|
format.html {render partial: 'trips/test'}
format.json {render partial: 'trips/test' }
format.url_encoded_form {render partial: 'trips/test'}
end
Update 2:
The Request headers for both localhost and production are the same, the content type is application/x-www-form-urlencoded, even though format.url_encoded_form? returns false.
Accept:*/*
Accept-Encoding:gzip, deflate, br
Accept-Language:en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4
Connection:keep-alive
Content-Length:37
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
You could try passing in the format, locale, and handlers exactly as requested:
render(
partial: 'trips/test',
formats: [:html, :js, :json, :url_encoded_form],
locale: [:en],
handlers: [:erb, :builder, :raw, :ruby, :coffee, :jbuilder])
I'm using Backbone.js and thus bootstrapping data using a JSON (jbuilder) partial like so (using HAML):
App.users = new App.UserList(#{render('users/index', :formats => [:json], :handlers => [:jbuilder], locals: {users: #users})})}, {silent:true});
It gives me this error:
ActionView::Template::Error (Missing partial users/index with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :jbuilder, :arb, :coffee, :haml]}. Searched in:
Notice that it is only looking for the ':html' format, despite me passing in 'formats: [:json]'. Should I be doing something differently?
Thank you for any help.
What version of Rails are you using? This problem was fixed for 3.2.3, but exists in earlier versions.
For a quick fix, though it will cause deprecation warnings in Rails 3.2 and later, you can add the format to the name of the template, i.e. render('users/index.json' ...