我尝试使用控制器中的更新方法更改已完成的值,这是一个布尔值,默认值为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
答案 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 %>