Rails的部分操作无法刷新

时间:2018-12-10 23:19:57

标签: ruby-on-rails ajax

我意识到有关此主题的问题很多,我已经仔细研究了其中的很多问题,并试图重复解决方案,但对我没有任何帮助。

我有一部分任务列表显示在索引视图中,当用户添加任务时,我希望列表显示最新任务(以及所有已经存在的其他任务)。

这是创建控制器:

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 %>

2 个答案:

答案 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"

这将使其起作用,但是我建议仅加载已创建的一列,并在表中仅添加一列,并且如果客户端上已有所有其他列,则不要再次更新完整列表。