我意识到有关此主题的问题很多,我已经仔细研究了其中的很多问题,并试图重复解决方案,但对我没有任何帮助。
我有一部分任务列表显示在索引视图中,当用户添加任务时,我希望列表显示最新任务(以及所有已经存在的其他任务)。
这是创建控制器:
def create
@task = current_user.tasks.build(task_params)
if @task.save
flash[:success] = "Task added"
respond_to do |format|
format.js
end
else
flash[:error] = "Task not added"
render 'new'
end
_new部分:
<%= form_for(@task, method: :post, remote: true) do |f| %>
<%= f.label :comments %>
<%= f.text_field :comments, id: "task-comments" %>
<%= f.submit "Insert" %>
<% end %>
Index.html.erb
<div id="new-task-form">
<%= render 'new' %>
</div>
<div id="current-tasks">
<%= render partial: 'show_list', locals: {tasks: @tasks} %>
</div>
create.js.erb
console.log("create.js.erb called");
document.getElementById("task-comments").value = "";
document.getElementById("current-tasks").html('<%= j(render partial: "show_list") %>');
我已经能够使控制台记录消息,甚至能够清除输入框,但是部分窗口无法呈现,我已经尝试了几种不同的方式,并且脚本似乎总是在执行时停止执行进入转义javascript行。
没有JS错误,如上所述,当按下“提交”按钮时,控制台会记录该消息。有一个警告[Violation] Forced reflow while executing JavaScript took 114ms
,但我认为与这个问题无关。
这是我要渲染_show_list.html.erb的部分内容
<% unless @tasks.nil? %>
<ul>
<% tasks.each do |tsk| %>
<li><%= tsk.comments %></li>
<% end %>
</ul>
<% end %>
答案 0 :(得分:1)
def create
@task = current_user.tasks.build(task_params)
if @task.save
flash[:success] = "Task added"
#respond_to do |format|
#format.js
#end
else
flash[:error] = "Task not added"
render 'new'
end
end
在局部变量中使用局部变量
始终是一个好习惯1)=> Index.html.erb
<div id="new-task-form">
<%= render 'new' %>
</div>
<div id="current-tasks">
<%= render partial: 'show_list', locals: {tasks: @tasks} %>
</div>
2)=>如果您使用的是jquery(create.js.erb)
console.log("create.js.erb called");
$("#task-comments").val('');
$("#current-tasks").html('<%= j render "show_list", tasks: @tasks) %>');
3)=> _show_list.html.erb(使用tasks
代替@tasks
)
<% unless tasks.blank? %>
<ul>
<% tasks.each do |tsk| %>
<li><%= tsk.comments %></li>
<% end %>
</ul>
<% end %>
答案 1 :(得分:0)
好的,您在show_list
部分上的验证存在一些问题。
你有这行
<% unless @tasks.nil? %>
尝试使用更具可读性的内容
<% if @tasks.present? %>
并在控制器上创建动作时,您不必填充@tasks变量,因此这实际上是问题,在保存新任务后,在控制器上为所有任务添加负载。
if @task.save
@tasks = Task.all
flash[:success] = "Task added"
这将使其起作用,但是我建议仅加载已创建的一列,并在表中仅添加一列,并且如果客户端上已有所有其他列,则不要再次更新完整列表。