2014-09-29 73 views
3

Todo有很多項目。我正在嘗試添加一個鏈接以從待辦事項列表中刪除一個項目。我已經嘗試過在todo列表中根據id找到一個項目的變體,我無法弄清楚。這是基於我所做更改的最新錯誤。我不知道如何解決這個問題。如何添加一個刪除路線與嵌套的資源軌道4

錯誤消息:No route matches [DELETE] "/todos/6/items"

藤控制器:

class TodosController < ApplicationController 
    respond_to :html, :js 
    before_action :set_todo, only: [:show, :edit, :update, :destroy] 

    # GET /todos 
    # GET /todos.json 
    def index 
    @todos = Todo.all 
    @todo = Todo.new 
    end 

    # GET /todos/1 
    # GET /todos/1.json 
    def show 
    end 

    # GET /todos/new 
    def new 
    @todo = Todo.new 
    #3.times{@todo.items.build} 
    end 

    # GET /todos/1/edit 
    def edit 
    end 

    # POST /todos 
    # POST /todos.json 
    def create 
    @todo = Todo.new(todo_params) 
    #@todo.items.build 

    respond_to do |format| 
     if @todo.save 
     format.html { redirect_to todos_path, notice: 'Todo was successfully created.' } 
     format.json { render :show, status: :created, location: @todo } 
     else 
     format.html { render :new } 
     format.json { render json: @todo.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PATCH/PUT /todos/1 
    # PATCH/PUT /todos/1.json 
    def update 
    @todo = Todo.find(params[:id]) 
    respond_to do |format| 
     if @todo.update(todo_params) 
     format.html { redirect_to @todo, notice: 'Todo was successfully updated.' } 
     format.json { render :show, status: :ok, location: @todo } 
     else 
     format.html { render :edit } 
     format.json { render json: @todo.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /todos/1 
    # DELETE /todos/1.json 
    def destroy 
    @todo.destroy 
    @todo.items.destroy 
    respond_to do |format| 
     format.html { redirect_to todos_url, notice: 'Todo was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_todo 
     @todo = Todo.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def todo_params 
     params.require(:todo).permit(:title, :completed, items_attributes: [:content,:completed, :_destroy]) 
    end 
end 

項目控制器:

class ItemsController < ApplicationController 
    before_action :set_item, only: [:show, :edit, :update, :destroy] 
    before_action :set_todo 
    respond_to :html, :js 

    # GET /items 
    # GET /items.json 
    def index 
    @items = Item.all 
    end 

    # GET /items/1 
    # GET /items/1.json 
    def show 
    @item = Item.find(params[:id]) 
    end 

    # GET /items/new 
    def new 
    @item = @todo.items.build 
    end 

    # GET /items/1/edit 
    def edit 
    @item = Items.find(params[:id]) 
    end 

    # POST /items 
    # POST /items.json 
    def create 
    @item = @todo.items.build(item_params) 

    respond_to do |format| 
     if @item.save 
     format.html { redirect_to [@todo,@item], notice: 'Item was successfully created.' } 
     format.json { render :show, status: :created, location: @item } 
     else 
     format.html { render :new } 
     format.json { render json: @item.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PATCH/PUT /items/1 
    # PATCH/PUT /items/1.json 
    def update 
    @item = Item.find(params[:id]) 
    respond_to do |format| 
     if @item.update(item_params) 
     format.html { redirect_to [@todo, @item], notice: 'Item was successfully updated.' } 
     format.json { render :show, status: :ok, location: @item } 
     else 
     format.html { render :edit } 
     format.json { render json: @item.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /items/1 
    # DELETE /items/1.json 
    def destroy 
    @todo.items.destroy 
    @item = Item.find(params[:id]) 
    @item.destroy 
    respond_to do |format| 
     format.html { redirect_to @todo, notice: 'Item was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_item 
     @item = Item.find(params[:id]) 
    end 

    def set_todo 
     @todo = Todo.find(params[:todo_id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def item_params 
     params.require(:item).permit(:content, :todo_id) 
    end 
end 

路線:

 Prefix Verb URI Pattern        Controller#Action 
    todo_items GET /todos/:todo_id/items(.:format)   items#index 
       POST /todos/:todo_id/items(.:format)   items#create 
new_todo_item GET /todos/:todo_id/items/new(.:format)  items#new 
edit_todo_item GET /todos/:todo_id/items/:id/edit(.:format) items#edit 
    todo_item GET /todos/:todo_id/items/:id(.:format)  items#show 
       PATCH /todos/:todo_id/items/:id(.:format)  items#update 
       PUT /todos/:todo_id/items/:id(.:format)  items#update 
       DELETE /todos/:todo_id/items/:id(.:format)  items#destroy 
     todos GET /todos(.:format)       todos#index 
       POST /todos(.:format)       todos#create 
     new_todo GET /todos/new(.:format)      todos#new 
    edit_todo GET /todos/:id/edit(.:format)    todos#edit 
      todo GET /todos/:id(.:format)      todos#show 
       PATCH /todos/:id(.:format)      todos#update 
       PUT /todos/:id(.:format)      todos#update 
       DELETE /todos/:id(.:format)      todos#destroy 

和我的索引頁:

<h1>Listing todos</h1> 
<ul> 
    <% @todos.each do |todo| %> 
    <li><%= link_to todo.title ,edit_todo_path(todo)%></li> 
     <ul> 
     <% todo.items.each do |item| %></br> 
      <li><%= item.content %></li> 
      <li><%= link_to 'Delete Item',todo_item_path(item.id), method: :delete, data: { confirm: "Are you sure you want to delete this item?"} %></li> 
     <% end %> 
     </ul> 
    <% end %> 
</ul> 


<%= link_to 'New Todo', new_todo_path %> 
+0

嘗試像這樣<%= link_to「delete」,[@todo,item],:method =>:delete%> – 2014-09-29 20:26:08

+0

我試過,它給了我ActionController :: UrlGenerationError - 沒有路由匹配{:action =>「show」,:controller =>「items」,:id =>「6」,::todo_id => nil}缺少必需的鍵:[:todo_id]:'Idk爲什麼需要todo_id或爲什麼它試圖路由以顯示? – 2014-09-29 20:29:51

+0

對不起.remove @符號並嘗試<%= link_to「刪除」,[todo,item],:method =>:delete%> – 2014-09-29 20:32:02

回答

2

請嘗試使用<%= link_to "delete", [todo, item], :method => :delete %>

+1

只是爲了解釋你爲什麼需要這個。看看你的Rake路由輸出中的這一行:'DELETE /todos/:todo_id/items/:id(.:format)items#destroy'。這就是你試圖打的路線,正如你會注意到的那樣,它同時需要一個'todo_id'和一個'item' ID(從params中簡單地提取''params [:id]')。所以你需要在你的路徑助手中提供兩個ID。你原來的解決方案只是給了todo_id,但由於你試圖從todo中刪除__item__,你還需要該項目的id。隱式稱爲路徑幫助器從數組Rahul中提取了兩個ids。 – Sasha 2014-09-30 14:34:07