Неправильно маршрутизированный метод Rails Destroy на вложенном ресурсе - PullRequest
2 голосов
/ 21 декабря 2011

У меня есть объект List с вложенными Задачами. Я создал страницу, которая отображает отдельные задачи, а также страницу, которая позволяет пользователю редактировать отдельные задачи. Теперь я хочу добавить возможность удаления задачи из списка на странице редактирования задач. Используя следующий код

<%= link_to 'Delete this task',@task, confirm: 'Are you sure?', method: :delete %>

выходы

undefined task_path method

Этот код находится на странице show.html.erb, где я вызываю @task для отображения всех данных, хранящихся в задаче, поэтому я считаю, что эта проблема может быть какой-то ошибкой маршрутизации, однако я не могу показаться чтобы понять это.

Связанный метод контроллера:

def destroy
    @task = Task.find(params[:id])
    @task.destroy

    respond_to do |format|
        format.html { redirect_to list_tasks_path(@task) }
        format.json { head :ok }
    end
end

Я думал, что при использовании метода delete, поставленная мною @task будет просто отправлена ​​методу destroy через params, но эта ошибка, похоже, показывает, что это не совсем так, как она работает. Так как же мне правильно уничтожить вложенный ресурс в Rails?

редактирование: Вот файл маршрута с вложенными ресурсами:

MyApp::Application.routes.draw do
    resources :lists do
        resources :tasks
    end
    get "home/index"

    root :to => 'home#index'
end

Спасибо за помощь!

Ответы [ 2 ]

5 голосов
/ 21 декабря 2011

У вас должна быть настройка @list или использование @ task.list (при условии, что у вас есть отношение к отношениям), и вы можете сделать следующее:

<%= link_to "Delete this task", list_task_path(@task.list, @task), confirm: "Are you sure?", method: :delete %>

Cheers!

4 голосов
/ 21 декабря 2011

Попробуйте это:

<%= link_to 'Delete this task', list_task_path(@list, @task), confirm: 'Are you sure?', method: :delete %>

Или, если вы хотите, чтобы он был более компактным (как вы написали):

<%= link_to 'Delete this task', [@list, @task], confirm: 'Are you sure?', method: :delete %>

В любом случае, поскольку это вложенный ресурс, вы должны передать оба объекта: @list и @task.

...