On 4/5/07, Jon <[EMAIL PROTECTED]> wrote: > > If a view file cannot be compiled (eg it has a block with a missing > 'end' statement), I'm experiencing WSODs - the browser reports a lost > network connection, rather than the helpful compilation error that we > used to have. > > When the compilation fails, ActionView#compile_template raises this > error : > > TemplateError.new(find_base_path_for(file_name || template), file_name > || template, @assigns, template, e) > > ...which appears to have a few things wrong with it. > > First off, file_name is always absolute here - eg /Users/jon/ > Developer/Stacker/app/views/kittens/index.rhtml. find_base_path_for > is going to fail since it tries to append that path onto the path from > @view_paths - typically /Users/jon/Developer/Stacker/app/views. > So, find_base_path_for returns nil. I *think* what happens is that > code inside template_error.rb later raises a second exception when it > tries to use that path as a string and finds it's nil, and that > exception isn't caught properly, so the response is never formed, > which produces the WSOD. If I replace it with > TemplateError.new(find_base_path_for(file_name || template) || "", > file_name || template, @assigns, template, e) > the compilation error is reported properly. > > The reason I'm posting here rather than submitting a patch to Trac is > that I'm struggling to understand a few things about that line of > code, and so I'm not sure of the best way to fix it. > > 'template' is the contents of the template file. So why are we trying > to use it as a filename for find_base_path_for()? Is it supposed to > be find_base_path_for(file_name) || template ? If so, why are we > creating a TemplateError with base_path=<file contents> ? Same > applies to the second parameter - if file_name is nil, use the > template content?? > Why is find_base_path_for being used at all? Why not File.dirname ?
Apparently this is the result of some incorrectly transcribed code when I committed the multiple viewpath support. BEFORE raise TemplateError.new(@base_path, file_name || template, @assigns, template, e) AFTER raise TemplateError.new(lookup_template_base_path_for(file_name || template), file_name || template, @assigns, template, e) The reason we have to call #find_base_path_for is TemplateError wants the current base path (app/views) instead of the path to the template file (app/views/your-controller). Since file_name is the full path, perhaps we just go through the available base_paths, looking for any that match the beginning of file_name. If none match, then just assume the first base_path (99% of the time you'll only have 1 anyway). Thanks for bringing this up! -- Rick Olson http://lighthouseapp.com http://weblog.techno-weenie.net http://mephistoblog.com --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en -~----------~----~----~----~------~----~------~--~---
