通过循环内的link_to更新属性,无法传递ID

时间:2016-03-30 21:42:16

标签: ruby-on-rails ruby ruby-on-rails-4

我尝试使用控制器中的更新方法更改已完成的值,这是一个布尔值,默认值为false。我试图制作它,以便我可以显示所有的task_items和它们旁边的链接来更改值。这就是我得到的:

TaskItem嵌套在TaskList

<% @task_list.task_items.each do |task_item| %>
  <%= task_item.content %>
  <%= link_to "Complete", task_list_task_item_path(task_list_id: @task_list.id, :task_item => {:completed => true} ), :method => :patch %>
<% end %>

我没有找到路线匹配缺少必需的密钥[:id]错误。

路线

  concern :has_task_lists do
    resources :task_lists, only: [:new, :index, :create, :show]
  end

  resources :events, :meetings, concerns: [:has_task_lists]

  resources :task_lists, except: [:new, :index, :create] do
    resources :task_items  
  end

控制器

class TaskItemsController < ApplicationController
    before_action :set_task_list

    def index
        @task_items = @task_list.task_items
    end

    def new
    @task_item = @task_list.task_items.new
  end

    def create
      @task_item = @task_list.task_items.new(task_item_params)
      if @task_item.save
        redirect_to :back
      else
        render :new
      end
  end

    def show
        @task_item = @task_list.task_items.find(params[:id])
  end

    def update
    @task_item = @task_list.task_items.find(params[:id])
    if @task_item.update_attributes(task_item_params)
      redirect_to :back, notice: "Task Item Updated"
    else
      render :edit
    end
  end

  def edit
    @task_item = @task_list.task_items.find(params[:id])
  end

    private

    def task_item_params
        params.require(:task_item).permit(:content, :completed)
    end

    def set_task_list
    @task_list = TaskList.find(params[:task_list_id])
  end

end

3 个答案:

答案 0 :(得分:1)

您没有将task_item传递给link_to ...如何知道要更新哪个任务项?

更好的可能是......

 <%= link_to "Complete", task_list_task_item_path(@task_list, task_item, :completed => true), :method => :patch %>

答案 1 :(得分:0)

链接应为:

<%= link_to "Complete", task_list_task_item_path(@task_list, task_item, completed: true), method: :patch %>

确保在application.js文件中需要jquery和jquery_ujs。因为在使用link_to和方法删除时确实遇到了问题,所以当我从application.js中删除需要jquery_ujs时补丁

答案 2 :(得分:0)

我已经解决了我的问题。

我创建了一个新方法,而不是使用更新并添加了自定义路由。还删除了一些对我没用的控制器方法。以下是适用于任何可能遇到类似问题的人的代码。

class TaskItemsController < ApplicationController

    Omitted Index, Create, etc.

    def complete
      @task_item = @task_list.task_items.find(params[:task_item_id])
      @task_item.completed = true
      if @task_item.save
        redirect_to :back
      end
    end

end

  resources :task_lists  do
    resources :task_items, only: [:new, :index, :create] do
      member do
        patch 'complete'
      end
    end
  end

<% @task_list.task_items.each do |task_item| %>
  <%= task_item.content %>
  <% if task_item.completed == false %>
    <%= link_to "Complete", complete_task_list_task_item_path(:task_list_id => @task_list.id, :task_item_id => task_item.id), method: :patch %> <br />
  <% end %>
<% end %>