#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 и, похоже, возвращает массив страниц, а не автора.