Метод уничтожения перестал работать

#ruby-on-rails

#ruby-on-rails

Вопрос:

У меня есть две модели: страница и авторы, когда я выбираю метод уничтожения, он просто возвращает страницу показа. Модели связаны, сообщая модели, что у автора есть_many :pages, а страница принадлежит many :author.

это код для моего контроллера страницы:

 class PagesController < ApplicationController

def index
@pages = Page.find(:all, :order => 'created_at DESC')
end

def show
@page = Page.find(params[:id])
end

def new
@page = Page.new
end

def edit
@page = Page.find(params[:id])
end

def create
@page = Page.new(params[:page])

if @page.save
      redirect_to(@page, :notice => 'Page was successfully created.')
  else
      render :action => "new"
  end
end

def update
@page = Page.find(params[:id])

  if @page.update_attributes(params[:page])
    redirect_to(@page, :notice => 'Page was successfully updated.')
  else
    render :action => "edit"
  end
end

def destroy
@page = Page.find(params[:id])
@page.destroy
end

def author
@pages = @author.pages
end

end
  

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

Спасибо

Ответ №1:

Я не знаю, что вы имеете в виду под

выберите метод уничтожения

Но я предполагаю, что вы просто обращаетесь к pages/:id URL в своем браузере? Это show действие, как вы сказали.

Для того, чтобы фактически уничтожить вашу модель (т. Е. получить доступ к destroy действию в контроллере), вам нужно отправить DELETE в /pages/:id .

Обычно это достигается с помощью чего-то вроде:

 <%= link_to 'Destroy', @page, :confirm => 'Are you sure?', :method => :delete %>
  

Обратите внимание на :method => :delete . Это фактически отправит DELETE на контроллер (при условии, что у вас есть ваш rails.js включен, чтобы позаботиться об этом) и, таким образом, сопоставляется с destroy действием вместо show action

Ответ №2:

Вы отключили JavaScript в своем браузере? 🙂

Ответ №3:

Пара вещей, на которые стоит обратить внимание:

  • Неясно, какой тип HTTP-запроса вы отправляете своему приложению. Тот факт, что действие show, похоже, запущено, заставляет меня думать, что ваш запрос является методом HTTP GET. Если вы хотите, чтобы было вызвано действие уничтожения, убедитесь, что это HTTP-метод УДАЛЕНИЯ.

  • Вы проверили свою базу данных, чтобы увидеть, был ли ActiveRecord уничтожен? Возможно, вы не видите никаких уведомлений просто потому, что вы не устанавливаете сообщение о флэш-уведомлении. Например:


 def destroy
  @page = Page.find(params[:id])
  flash[:notice] = "Page successfully removed" 
  @page.destroy
  # You may also want to have a redirect here, e.g. redirect_to @pages
end
  
  • Отдельно отмечу, что не уверен, чего вы пытаетесь достичь с помощью метода author в вашем контроллере, но это выглядит неправильно. Это не restful и, похоже, возвращает массив страниц, а не автора.