link_to 'delete' не уничтожает запись - PullRequest
0 голосов
/ 07 сентября 2018

Я следую инструкциям Майкла Хартла по рельсам Глава 13 , но вместо микросообщений я создаю животных.

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

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

Вот мой код из вида:

<li id="animal-<%= animal.id %>">
  <%= link_to gravatar_for(animal.user, size: 50), animal.user %>
  <span class="user"><%= link_to animal.user.name, animal.user %></span>
  <span class="ear_tag"><%= animal.ear_tag %></span>
  <span class="timestamp">
    Posted <%= time_ago_in_words(animal.created_at) %> ago.
    <% if current_user?(animal.user) %>
      <%= link_to "delete", animal, method: :delete, data: { confirm: "You sure?" } %>
    <% end %>
  </span>
</li>

Это представление вызывается из представления канала:

<% if @feed_items.any? %>
  <ol class="animals">
    <%= render @feed_items %>
  </ol>
  <%= will_paginate @feed_items %>
<% end %>

Что происходит из вида домашней страницы:

<div class="col-md-8">
  <h3>Animal Feed</h3>
  <%= render 'shared/feed' %>
</div>

Я много раз просматривал строку <%= link_to..., и она кажется правильной. Код моего контроллера:

class AnimalsController < ApplicationController
  before_action :logged_in_user,  only: [:create, :destroy]
  before_action :correct_user,    only: :destroy

  def destroy
    @animal.destroy
    flash[:success] = "Animal deleted"
    redirect_to request.referrer || root_url
  end

  def correct_user
    @animal = current_user.animals.find_by(id: params[:id])
    redirect_to root_url if @animals.nil?
  end
end

Я заметил, что я никогда не вижу вспышку «Животное удалено», и это говорит мне, что я, вероятно, не дошел до этой точки в методе контроллера.

Код моей модели:

class Animal < ApplicationRecord
  belongs_to :user
  default_scope -> {order(created_at: :desc) }
  validates :user_id, presence: true
  validates :ear_tag, presence: true, length: {maximum: 20}
end

Вот мой файл application.js из app / assets / javascripts:

//= require jquery
//= require bootstrap
//= require rails-ujs
//= require turbolinks
//= require_tree

Вот что пишет журнал сервера после того, как я щелкнул по тегу «delete» в моем представлении в браузере:

Started DELETE "/animals/308" for 23.25.133.17 at 2018-09-06 21:11:06 +0000
Processing by AnimalsController#destroy as HTML
  Parameters: {"authenticity_token"=>"vwF6cWow+6B3BxOiJElVY0aQmMGr4WLWDOCxgB0C03nRLcQDKC3YCUqBr4ahVwlSKN7bEYRrmGytyI1fPgvavw==", "id"=>"308"}
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 102], ["LIMIT", 1]]
  Animal Load (0.2ms)  SELECT  "animals".* FROM "animals" WHERE "animals"."user_id" = ? AND "animals"."id" = ? ORDER BY "animals"."created_at" DESC LIMIT ?  [["user_id", 102], ["id", 308], ["LIMIT", 1]]
Redirected to https://cabfa13dd4f34e67b634d4f52a7a046f.vfs.cloud9.us-west-2.amazonaws.com/
Filter chain halted as :correct_user rendered or redirected
Completed 302 Found in 4ms (ActiveRecord: 0.3ms)

Я также обнаружил, что один из моих тестов не прошел:

FAIL["test_animal_interface", AnimalsInterfaceTest, 1.5248641059999954]
 test_animal_interface#AnimalsInterfaceTest (1.53s)
        "Animal.count" didn't change by -1.
        Expected: 38
          Actual: 39
        test/integration/animals_interface_test.rb:33:in `block in <class:AnimalsInterfaceTest>'

1 Ответ

0 голосов
/ 07 сентября 2018

Цепочка фильтров остановлена ​​как: правильный_пользователь обработан или перенаправлен

Проблема в том, что у вас есть @animals (, что не определено ) вместо @animal, поэтому redirect_to root_url if @animals.nil? всегда завершается , что приводит к уничтожить действие, терпящее неудачу всегда. Вы должны изменить @animals на @animal

def correct_user
  @animal = current_user.animals.find_by(id: params[:id])
  redirect_to root_url if @animal.nil?
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...