Динамическая передача Div ID из контроллера Rails в файл js.erb - PullRequest
0 голосов
/ 04 апреля 2019

Я создаю приложение, в котором есть задачи, и пользователи могут ставить лайки и комментировать задачи.Я добавляю функцию «Мне нравится» и «Комментарии» на самой странице индекса.

Страница индекса отображает комментарии частично для каждой задачи:

tasks / _comments.html.erb

<div class="comments-div">
<% if comments.present? %>
<% comments.each do |comment| %>
    <div class="comment-div">
        <div><img src="/assets/user.png" class="comment-img">
        <p class='comment-desc'><%= comment.description %></p></div>
        <p class="height-10">User: <%= comment.user.name %></span>
            <span class="right">Commented On: <%= comment.created_at.strftime("%d %b %y") %></span>     
        </p>
    </div>
<% end %>
<% end %>
</div>
<div class="comments-form">
            <%= form_for :comment, url: "comments/add_comments", remote: true, html: { id: 'comment-form' } do |form| %>

              <%= form.hidden_field :task_id, value: task_id %>
              <div class="search-fields">
                <%= form.text_area :description %>
              </div>

              <div>
                <%= form.submit 'Comment', id: 'ad-comment-btn', remote: true, 'data-task-id' => task_id, click: 'form_action(this);' %>
              </div>
            <% end  %>

</div>

Этот js выполняется при добавлении формы добавления комментария.

application.js

    $('.comments-form form').submit(function(e){
    e.preventDefault();
    var taskId = this.elements[1].value;
    var description = this.elements[2].value;
    var comment_params = JSON.stringify({task_id: taskId, description: description});
    $.post("/comments/add_comments?comment=" + comment_params);
    return false;
})

comments_controller:

def add_comments
    comment_params = JSON.parse(params[:comment])
    comment_params.merge!({user_id: current_user.id})
    @comment = Comment.create(comment_params)
    @task_container_id = "task-comments-container_#{comment_params['task_id']}"
    @comments = Comment.where(task_id: comment_params["task_id"]).to_a
    @task_id = comment_params["task_id"]

    if @comment.save
        flash[:success] = "Comment created Successfully"
    else
        flash[:error] = "Something went wrong. Try again"
    end

    respond_to do |format|
  format.js       
end
end

Я передаю @task_container_id из контроллера и пытаюсьчтобы использовать его в файле js.erb.

add_comments.js.erb

$('#"<%= @task_container_id %>"').html("<%= escape_javascript(render partial: 'tasks/comments', locals: { comments: @comments, task_id: @task_id } ) %>"); 

Я хочу заменить идентификатор div здесь $ ('# "<% = @task_container_id%>" "'), который передается контроллером.Но div не обновляет, как ожидалось.если я жестко закодирую div id в файле js.erb, обновление происходит правильно.

Как это исправить?

Ответы [ 3 ]

0 голосов
/ 04 апреля 2019

Можете ли вы попробовать следующее,

escape_javascript имеет псевдоним j, поэтому вы можете использовать его. Я предположил, что вы уже получаете элемент с этим динамическим идентификатором и уже визуализируете 'tasks/comments' в этом div с динамическим идентификатором.

add_comments.js.erb

$("#'<%= @task_container_id %>'").html("<%= j render(partial: 'tasks/comments', locals: { comments: @comments, task_id: @task_id } ) %>"); 

Удачи!

0 голосов
/ 04 апреля 2019

Это очень незначительная ошибка, которую я совершил.

add_comments.js.erb

$("#<%= @task_container_id %>").html("<%= escape_javascript(render partial: 'tasks/comments', locals: { comments: @comments, task_id: @task_id } ) %>"); 

Пришлось удалить лишнюю одинарную кавычку ("# '<% = @task_container_id%>'") до простого $ ("# <% =@task_container_id%> ")

0 голосов
/ 04 апреля 2019

В вашем aplication.js elements array is zero based, поэтому измените значение на 0 и 1 соответственно при извлечении taskId и описания

var taskId = this.elements[0].value;
var description = this.elements[1].value;

----------------------- ОБНОВЛЕНО ----------------------- ---

Полагаю, я нашел ошибку

в вашем контроллере

изменить @task_id = comment_params["task_id"] на @task_id = comment_params[:task_id]

enter image description here

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