ActionView :: MissingTemplate - 与AJAX相关的错误

时间:2013-04-26 16:08:31

标签: javascript ruby-on-rails ajax ruby-on-rails-3.2 actionview

左列div是列表列表。我正在尝试使用AJAX添加新列表。我正在关注截屏视频http://railscasts.com/episodes/136-jquery-ajax-revised,但我收到了错误消息。这似乎是创建操作的问题。请注意,当我刷新页面时,会出现新列表,以便创建它并将其添加到数据库中。

当我尝试提交新列表的名称时,我收到的500内部服务器错误(来自使用网络选项卡中的POST的列表文件):

列表中的ActionView :: MissingTemplate #create

显示/Users/jeff/Documents/rails_projects/grocery-beta/app/views/lists/create.js.erb第3行提出:

Missing partial lists/list with {:locale=>[:en], :formats=>[:js, :html], :handlers=>[:erb, :builder, :coffee]}. Searched in:  * "/Users/jeff/Documents/rails_projects/grocery-beta/app/views"  * "/usr/local/rvm/gems/ruby-1.9.3-p194/gems/devise-2.2.3/app/views"

摘录的来源(第3行):

1: $('#new_list').remove();2: $('#new_link').show();3: $('#lists').append('<%= j render(@list) %>');

app/views/lists/create.js.erb:3:in `_app_views_lists_create_js_erb__870295634789681698_70311054285220'app/controllers/lists_controller.rb:36:in `create'

这是我的create.js.erb文件:

$('#new_list').remove();
$('#new_link').show();
$('#lists').append('<%= j render(@list) %>');

以下是我的lists_controller.rb文件中的创建操作

def create
    @list = List.create!(params[:list])
    respond_to do |format|
      format.html { redirect_to root_url }
      format.js
    end
  end

以下是根页home.html.erb

<div id="main-left">
    <div id="main-left-1">
        <%= link_to 'Add List', new_list_path, class: "button", id: "new_link", remote: true %>
    </div>
    <ul id="lists" data-update-url="<%= sort_lists_url %>">
      <% @lists.each do |list| %>
        <%= content_tag_for :li, list do %>
          <%= link_to list.name, list, :remote => true, :class => "link" %>
        <% end %>
      <% end %>
    </ul>
</div>

这是我的_form.html.erb parial文件:

<%= form_for @list, remote: true do |f| %>

  <% if @list.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@list.errors.count, "error") %> prohibited this list from being saved:</h2>

      <ul>
      <% @list.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.text_field :name %>
  </div>
<% end %>

这是我的application.html.erb文件:

<!DOCTYPE html>
<html>
    <head>
        <title>
            Grocery List
        </title>
        <%= stylesheet_link_tag "application", :media => "all" %>
        <%= javascript_include_tag "application" %>
        <%= csrf_meta_tags %>
        <link href='http://fonts.googleapis.com/css?family=Noto+Serif|Gabriela' rel='stylesheet' type='text/css'>
    </head>
    <body>
      <div id="wrapper">
        <%= render 'layouts/header' %>
        <div id="main">
            <%= yield %>
        </div><!-- main -->
      </div><!-- wrapper -->
  </body>
</html>

这是我的new.js.erb文件:

$('#new_link').hide().after('<%= j render("form") %>');

1 个答案:

答案 0 :(得分:1)

似乎render(@list)中存在问题。 Rails找不到合适的模板来呈现。

建议修改:

create.js.erb

# The task is to rendering a piece of "list" and add it to exist "lists"
# Suppose the template of this piece is "list/_piece.html.erb"
# It's necessary to pass `@list` variable so that it knows which one to show
$('#lists').append('<%= j render(partial: 'piece', locals: {list: @list}) %>');

然后在_piece.html.erb中,使用本地变量list但不使用@list阅读:

<li><%= list.name %></li>

然后你的代码应该可以工作。

附注:“片段”模板也可以在index模板或列表的侧栏列表中调用,因此它将是DRY。