【问题标题】:Getting "Template is missing" error when attempting to render js.erb file尝试呈现 js.erb 文件时出现“模板丢失”错误
【发布时间】:2013-06-10 20:18:12
【问题描述】:

我是 Rails 新手,遇到了无法渲染 .js.erb 文件的问题。我认为问题的根源在于 Rails 的内部路由机制希望我这样命名和配置我的文件,但我缺少一两部分,我不确定如何查找需要修复的部分.

我有一个带有控制器操作链接的 HTML 视图:

<%# snip %>
<div id="holding_issues_list">
  <%= link_to "Show issues on hold", {
      :action => "show_user_issues",
      :controller => "support",
      :issue_type => "holding",
      :user_id => @user.id },
    :remote => true %>
</div>
<%# snip %>

我认为(但我不确定):remote =&gt; true 会导致链接进行 AJAX 调用。

这是控制器app/controllers/support_controller.rb中对应的控制器动作:

def show_user_issues
  @target_div = params[:target_div] || "holding_issues_list"
  user = User.find(params[:user_id])
  issue_type = params[:issue_type]

  #snip - set the value of @issues
end

我希望在控制器退出时呈现这个名为 show_user_issues.js.erb 并放置在 app/views/support 中的文件:

$("#<%= @target_div %>").show();
alert('test');
$("#<%= @target_div %>").html(
  "<%= escape_javascript render :partial => '_show_user_issues', :locals => {:target_div => @target_div, :issues => @issues} %>");

这是app/views/support/_show_user_issues.html.erb,我想让show_user_issues.js.erb渲染的部分:

<% for issue in @active_issues %>
  <div id="issue_<%= issue.id %>_display">
      <%= render :partial => 'show_issue_mini', :locals => {:issue => issue} %>
  </div>
<% end %>

当我尝试单击原始 HTML 视图中的链接时,没有任何反应。当我在新选项卡中打开它时,我收到以下错误消息:

模板丢失

缺少模板支持/show_user_issues, 应用程序/show_user_issues 与 {:locale=>[:en], :handlers=>[:builder, :erb], :formats=>[:html]}。搜索:* "/home//app/views" * "/home//gems/kaminari-0.14.1/app/views"

我放入 show_user_issues.js.erbalert('test') 没有显示出来,所以我认为 Rails 在渲染该文件时挂了 - 也就是说,路由机制不能找到它。我该如何解决这个问题?

附:我仔细检查了所有文件名是否与代码库中的完全相同。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3.2


    【解决方案1】:

    更改您的控制器操作以处理请求类型。

    def show_user_issues
      @target_div = params[:target_div] || "holding_issues_list"
      user = User.find(params[:user_id])
      issue_type = params[:issue_type]
    
      #snip - set the value of @issues
    
      respond_to do |format|
        format.js
      end
    end
    

    这将检查.js 的请求格式,以防:remote =&gt; true。所以它会通过渲染show_user_issues.js.erb文件来处理它。

    【讨论】:

      【解决方案2】:

      我在应用 Manoj Monga 的回答后遇到的其他几个问题,我怀疑其他新的 Rails 开发人员可能会遇到:


      show_user_issues.js.erb,我有

      [...].html("<%= escape_javascript render :partial => '_show_user_issues',[...]
      

      '_show_user_issues' 之前的下划线导致 ERB 构建器失败。应该是'show_user_issues'


      _show_user_issues.html.erb,我有

      <% for issue in @active_issues %>
      

      如果你仔细观察show_user_issues.js.erb,我将变量命名为@issues,而不是@active_issues

      [...]:locals => {:target_div => @target_div, :issues => @issues}[...]
      

      所以我将 HTML 部分中的行更改为

      <% for issue in @issues %>
      

      在最后几个更改之后,我添加的新功能按预期工作。

      【讨论】:

      • 我想,在我看到您缺少格式部分后,我忽略了这些要点。 :)
      • @ManojMonga 没关系。 format.js 部分是我最想念的部分——在那之后,我很快就能弄清楚其余的部分。我只是想把它留在这里,以防将来有人遇到类似的问题。谢谢你的帮助! =)
      • 这个论坛的主要目的是帮助遇到它的每个人,因此你在这个答案上得到 +1 ;) 顺便说一句,欢迎你 :)
      猜你喜欢
      • 1970-01-01
      • 2016-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-01
      • 2014-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多