0

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

这是我在尝试提交新列表的名称时得到的 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临时文件:

<%= 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") %>');
4

1 回答 1

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。

于 2013-04-26T16:39:20.237 回答