Rails вызывает ajax, не находя переменную при отправке через частично локальные - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь внедрить систему Like / Unlike в мое веб-приложение.

Это ошибка, которую я получаю:

ActionView::Template::Error (undefined local variable or method `task' for #<#<Class:0x007f909b6cc680>:0x007f909b65dfa0>
Did you mean?  @task):
    1: <% if user_signed_in? && current_user.likes?(task) %>
    2:  <%= link_to "Downvote/Unlike", task_like_path(task), method: :delete, remote: true %>
    3: <% else %>
    4:  <%= link_to "Upvote/Like", task_like_path(task), method: :post, remote: true %>

app/views/tasks/_likes.html.erb:1:in `_app_views_tasks__likes_html_erb__4604839685375789387_70129528145700'
app/views/tasks/likes/destroy.js.erb:1:in `_app_views_tasks_likes_destroy_js_erb__2774523607266188291_70129537297860'

Проблема, с которой я столкнулся, заключается в том, что в моем контроллере задач нет действия show. Вместо этого я использую модальный метод, который вызывается из пути к заданию # index. Это означает, что я перебираю свой @tasks из моего метода контроллера индекса и отправляю каждую отдельную задачу как локальную для моего модального партиала.

Я пытаюсь сделать то же самое с Liking / Unliking. Я вставлю в мой код ниже

Вот так выглядит мой контроллер лайков:

def create
    @task = Task.find(params[:task_id])
    @task.likes.where(user_id: current_user.id).first_or_create

    respond_to do |format|
      format.html { render partial: "shared/task_modal", task: @task }
      format.js
    end
  end

Вот как я называю свои Задачи # Показать модальный из index.html.erb:

<% @tasks.each do |task| %>
   <h2><i class="fa fa-caret-up"></i> <%= link_to task.title, 'javascript:void(0)', "data-toggle" => "modal", 'data-target' => '#task_modal' %></h2>
   <%= render "shared/task_modal", task: task %>
<% end %>

Вот основной фрагмент моего партиала task_modal:

<div class="modal-body">
        <p><%= task.description %></p>
        <i><%= task.reward %> OMG</i><br>
        <i><%= task.difficulty.titleize %></i><br>
        <i>Max submissions: <%= task.max_submissions %></i>
        <hr>
        <!-- Add logic here for admin (if admin, show following button) -->
        <%= link_to "Edit Task", edit_task_path(task), class: "btn btn-secondary btn-mini" %>
      </div>

      <div id="likes">
        <%= render 'likes', task: task %>
      </div>

      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
      </div>

Мои views/tasks/likes/create.js.erb и мои destroy.js.erb выглядят так:

$('#likes').html("<%= j render partial: 'tasks/likes', task: task %>");

И все же по какой-то причине при рендеринге частичного я не могу отправить задачу локально. Какое решение для этого, кроме создания переменной экземпляра для задачи?

EDIT: Я только что попытался удалить partial из моего рендера. Это дает мне следующую ошибку:

ActionView::Template::Error (undefined local variable or method `task' for #<#<Class:0x007f909b6cc680>:0x007f90a2afb8a8>
Did you mean?  @task):
    1: $('#likes').html("<%= j render 'tasks/likes', task: task %>");

app/views/tasks/likes/create.js.erb:1:in `_app_views_tasks_likes_create_js_erb___3082837621974805143_70129597727640'

Есть ли способ отправить переменную задачи в мои js-файлы?

1 Ответ

0 голосов
/ 30 апреля 2018

Я получил это работает. Итак, у меня есть @task, объявленный в моем контроллере Tasks при создании и уничтожении действий. Это означает, что он используется для показа и уничтожения файлов js.erb. Все, что мне нужно было сделать, это изменить мой js, чтобы использовать переменную экземпляра как локальную, например: $('#likes').html("<%= j render 'tasks/likes', task: @task %>");

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