Я пытаюсь внедрить систему 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-файлы?