这里可能存在一系列问题:
- 您的Ajax ping是哪个URL?
- 您的
create
方法实际上是在create
记录吗?
- 是否有
create.js.erb
加载?
阿贾克斯
这是Ajax的低调 –
Rails通过HTTP“请求”工作 。 每次向应用程序发送“请求”时,它都会返回与该请求中的数据相对应的数据
这意味着如果要将新数据附加到页面(无需刷新),则需要以某种方式发送请求(Ajax)
Ajax基本上就是Javascript,就像一个伪浏览器; 代表您向服务器发送请求(异步),允许您回调数据并将其附加到DOM
url
<%= form_for [task, task.subtasks.build],:remote => true do |f| %> <%= f.text_area :name,rows:'3',cols:'3'%> <%= f.submit "save",class:'btn btn-success' %> <% end %>
您正在使用Rails内置Ajax ,但我们需要知道它将在哪个路由上ping。 您需要向我们显示Ajax将数据发送到哪个URL。 我认为您的问题的一部分可能与task.subtasks.build
调用有关
创建
您的create
方法可以稍微重构一下:
#app/controllers/subtasks_controller.rb def create @task= Task.find(params[:task_id]) @project = @task.project @subtask = @task.subtasks.new(subtask_params) @subtask.save respond_to do |format| format.html{redirect_to @project, flash[:success] = "Task created successfully"} format.js # -> you can't send the Flash object through xhr end end private def subtask_params params.require(:subtask).permit(:name) end #app/models/subtask.rb Class SubTask < ActiveRecord::Base validates :name, presence: true # -> Causes forms to fail gracefully end
创建JS
如果你的create
方法正常,问题可能出在你的JS上:
#app/views/subtasks/create.js.erb $('#addtaskdiv_'+ <%=@task.id %>).append('<%=j render partial: "subtasks/partial_name", object: @subtask %>');
部分问题是您将@subtask
实例变量发送到部分。 我认为你不能这样做(可能是错的)。 您需要为partial调用绝对路径,并将实例var作为对象传递