Частичное Rails не обновляется с действием create - PullRequest
0 голосов
/ 11 декабря 2018

Я понимаю, что здесь есть десятки подобных вопросов по этой теме, я просмотрел многие из них и попытался продублировать решения, но у меня ничего не получилось.

У меня есть список задач, отображаемый виндексное представление как частичное, когда пользователь добавляет задачу, я хотел бы, чтобы список отображал новейшую задачу (а также все остальные, которые уже были там).

Вот контроллер создания:

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

Я смог получить консоль для записи сообщения и даже смог очистить поле ввода, но частичное не рендерится, я пробовал это несколькими различными способами икажется, что скрипт всегда останавливается, когда достигает строки escape-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 голосов
/ 11 декабря 2018
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 %>
0 голосов
/ 11 декабря 2018

хорошо, у вас есть некоторые проблемы с проверкой на частичном show_list.у вас есть эта строка

<% unless @tasks.nil? %>

попробуйте использовать что-то более читабельное, например

<% if @tasks.present? %>

, и на вашем контроллере создайте действие, вы не заполняете переменную @tasks, так что это проблемав действительности, добавьте на свой контроллер нагрузку для всех задач после сохранения новой.

if @task.save
  @tasks = Task.all
  flash[:success] = "Task added"

, и это заставит ее работать, но я рекомендую загрузить только созданную и добавить только один столбец ктаблицу и не обновлять полный список снова, если у вас уже есть все остальные на клиенте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...