2014-09-29 83 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