带有Rails的AJAX-缺少模板 [英] AJAX with Rails - Missing Template

查看:36
本文介绍了带有Rails的AJAX-缺少模板的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试让AJAX在我的应用程序上正常运行,并遇到奇怪的 ActionView :: MissingTemplate 错误.我将其作为我的 tasks#create 方法:

I'm trying to get AJAX working on my app and am getting a strange ActionView::MissingTemplate error. I have this as my tasks#create method:

def create
    @task = Task.new(task_params)
    @task.user_id = current_user.id
    if @task.save
      respond_to do |format|
        format.js
        format.html
      end
    #   redirect_to tasks_path, notice: 'Task was successfully created.'
    else
      render :new
    end
  end

这是我的 views/tasks/create.js.erb :

$("#onetime-todo").html("<%= escape_javascript(render partial: 'items', locals: { task: @one_time }) %>")
$("#onetime-done").html("<%= escape_javascript(render partial: 'done', locals: { task: @one_time_done }) %>")

$("#daily-todo").html("<%= escape_javascript(render partial: 'items', locals: { task: @daily }) %>")
$("#daily-done").html("<%= escape_javascript(render partial: 'done', locals: { task: @daily_done }) %>")

$("#weekly-todo").html("<%= escape_javascript(render partial: 'items', locals: { task: @weekly }) %>")
$("#weekly-done").html("<%= escape_javascript(render partial: 'done', locals: { task: @weekly_done }) %>")

$("#monthly-todo").html("<%= escape_javascript(render partial: 'items', locals: { task: @monthly }) %>")
$("#monthly-done").html("<%= escape_javascript(render partial: 'done', locals: { task: @monthly_done }) %>")

这在我的 tasks/index.html.erb 上:

            <%= simple_form_for(@create_task) do |f| %>
                <div class="row">
                    <div class="container">
                        <div class="col-xs-12 col-sm-9">
                            <%= f.text_field :name, placeholder: "What needs to get done?", class: "form-control" %>
                        </div>
                        <div class="col-xs-12 col-sm-3">
                            <%= f.select :frequency, options_for_select([["One-Time", "OneTime"],["Daily", "Daily"],["Weekly", "Weekly"],["Monthly", "Monthly"]]), {}, {class: "form-control"} %>
                        </div>
                        <div class="col-xs-12 text-center">
                            <%= f.button :submit, class: "btn ghost", remote: true %>
                        </div>
                    </div> <!-- container -->
                </div> <!-- row -->
            <% end %>

....

      <div class="col-xs-12 col-md-6 col-lg-12">
        <div class="content-box border-green">
          <h1>One-Time Tasks</h1>
                <div id="onetime-todo"><%= render partial: 'items', locals: { task: @one_time } %></div>
                <div id="onetime-done"><%= render partial: 'done', locals: { task: @one_time_done } %></div>
        </div> <!-- content box -->
        </div> <!-- col -->

        <div class="col-xs-12 col-md-6 col-lg-4">
        <div class="content-box">
          <h1>Daily</h1>
          <div id="daily-todo"><%= render partial: 'items', locals: { task: @daily } %></div>
          <div id="daily-done"><%= render partial: 'done', locals: { task: @daily_done } %></div>
        </div> <!-- content box -->
        </div> <!-- col -->

        <div class="col-xs-12 col-md-6 col-lg-4">
        <div class="content-box">
          <h1>Weekly</h1>
          <div id="weekly-todo"><%= render partial: 'items', locals: { task: @weekly } %></div>
          <div id="weekly-done"><%= render partial: 'done', locals: { task: @weekly_done } %></div>
        </div> <!-- content box -->
        </div> <!-- col -->

        <div class="col-xs-12  col-md-6 col-lg-4">
        <div class="content-box">
          <h1>Montly</h1>
          <div id="monthly-todo"><%= render partial: 'items', locals: { task: @monthly } %></div>
           <div id="monthly-done"><%= render partial: 'done', locals: { task: @monthly_done } %></div>
        </div> <!-- content box -->
        </div> <!-- col -->

有人可以看到我要去哪里了吗?这似乎是一个奇怪的错误,因为我有一个创建模板.我的服务器日志显示如下:

Can anyone see where I'm going wrong? It seems like a weird error because I do have a create template. My server log shows this:

Started POST "/tasks" for ::1 at 2017-08-13 21:48:44 -0700
Processing by TasksController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"guwmQBf1AmKhxvi1coysoegbkKhy6Znk/oMKEar4TXcZ1OieTqiyRnf3m3MR/XHBrOsJ1d7ncZp8pzqAxC93tQ==", "task"=>{"name"=>"Testing oh testing", "frequency"=>"OneTime"}, "commit"=>"Create Task"}
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ?  ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
   (0.1ms)  begin transaction
  SQL (0.5ms)  INSERT INTO "tasks" ("name", "frequency", "user_id", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?)  [["name", "Testing oh testing"], ["frequency", "OneTime"], ["user_id", 1], ["created_at", "2017-08-14 04:48:44.237114"], ["updated_at", "2017-08-14 04:48:44.237114"]]
   (2.0ms)  commit transaction
Completed 500 Internal Server Error in 13ms (ActiveRecord: 2.6ms)

ActionView::MissingTemplate - Missing template tasks/create, application/create with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee]}. Searched in:
  * "/Users/lizbayardelle/Dropbox/Code/FAM/app/views"
  * "/Users/lizbayardelle/.rvm/gems/ruby-2.3.3/gems/ckeditor-4.2.2/app/views"
  * "/Users/lizbayardelle/.rvm/gems/ruby-2.3.3/gems/devise-4.2.0/app/views"

我的 routes.rb 非常简单,只要有帮助:

And my routes.rb are very simple, if it helps:

资源:任务

有人可以在这里帮助吗?

Can anyone help here?

其他信息

根据要求,这是我的 tasks#index 方法:

As requested, here is my tasks#index method:

  def index
    @create_task = Task.new
    @tasks = Task.all
    @one_time = Task.where(frequency: "OneTime", completed: false, user_id: current_user.id)
    @one_time_done = Task.where(frequency: "OneTime", completed: true, user_id: current_user.id)
    @daily = Task.where(frequency: "Daily", completed: false, user_id: current_user.id)
    @daily_done = Task.where(frequency: "Daily", completed: true, user_id: current_user.id)
    @weekly = Task.where(frequency: "Weekly", completed: false, user_id: current_user.id)
    @weekly_done = Task.where(frequency: "Weekly", completed: true, user_id: current_user.id)
    @monthly = Task.where(frequency: "Monthly", completed: false, user_id: current_user.id)
    @monthly_done = Task.where(frequency: "Monthly", completed: true, user_id: current_user.id)
  end

推荐答案

我正在尝试让AJAX在我的应用程序上运行,并且变得很奇怪 ActionView :: MissingTemplate 错误.

该请求是作为 HTML 发出的,也就是说,提交 button 中的 remote:true 无效,请尝试进行设置在 form 标记中,如下所示:

The request is being made as HTML, that is, the remote: true in the submit button is not working, try setting it in the form tag, like this:

<%= simple_form_for(@create_task), remote: true do |f| %>


我的服务器出现此错误:

I'm getting this error in my server:

在28毫秒内完成500个内部服务器错误(ActiveRecord:1.3毫秒)NoMethodError-nil:NilClass的每个未定义方法:app/views/tasks/_items.html.erb:2:in_app_views_tasks__items_html_erb__1746796241772610323_702981‌03116960'

Completed 500 Internal Server Error in 28ms (ActiveRecord: 1.3ms) NoMethodError - undefined method each' for nil:NilClass: app/views/tasks/_items.html.erb:2:in _app_views_tasks__items_html_erb__1746796241772610323_702981‌​03116960'

问题是 create.js.erb 中所需的所有变量都没有在 create 操作中设置,而是仅在 index .因此,您还需要在 create 中创建所有这些变量,但是可以避免使用 before_action 回调重复,如下所示:

The problem is that all variables that are required in create.js.erb have not being set in create action, they are only set in index. So you need to create all those variables also in create, but you can avoid repetition using a before_action callback, like this:

class TasksController < ApplicationController
  before_action :set_variables, only: [:index, :create]

  def index
  end

  def create
    @task = Task.new(task_params)
    @task.user_id = current_user.id
    if @task.save
      respond_to do |format|
        format.js
        format.html
      end
    #   redirect_to tasks_path, notice: 'Task was successfully created.'
    else
      render :new
    end
  end

  # other actions
  private
  def set_variables
    @create_task = Task.new
    @tasks = Task.all
    @one_time = Task.where(frequency: "OneTime", completed: false, user_id: current_user.id)
    @one_time_done = Task.where(frequency: "OneTime", completed: true, user_id: current_user.id)
    @daily = Task.where(frequency: "Daily", completed: false, user_id: current_user.id)
    @daily_done = Task.where(frequency: "Daily", completed: true, user_id: current_user.id)
    @weekly = Task.where(frequency: "Weekly", completed: false, user_id: current_user.id)
    @weekly_done = Task.where(frequency: "Weekly", completed: true, user_id: current_user.id)
    @monthly = Task.where(frequency: "Monthly", completed: false, user_id: current_user.id)
    @monthly_done = Task.where(frequency: "Monthly", completed: true, user_id: current_user.id)
  end
end

这篇关于带有Rails的AJAX-缺少模板的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆