我是Rails的新手。我正在尝试嵌套。我有工作,每个工作都分配了任务,但是当我尝试更新任务时,我收到错误No route matches [PATCH] "/ jobs / 2 / tasks"
我应该在路线上做出改变吗?
提前致谢
我的路线
Rails.application.routes.draw do
root 'jobs#index'
resources :sessions
resources :users
resources :jobs do
resources :tasks
end
match 'jobs/:job_id/tasks', to: "jobs/tasks#index", via: :get
get 'admin' => 'jobs#index'
end
任务/形式
<%= form_for @task, url: job_tasks_path do |f| %>
<% if @task.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@task.errors.count, "error") %> prohibited this post from being saved:</h2>
<ul>
<% @task.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :text %><br>
<%= f.text_area :text %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
任务控制器
def update
respond_to do |format|
if @task.update(task_params)
format.html { redirect_to job_tasks_url, notice: 'Zadanie zostało pomyslnie zmienione.' }
format.json { render :show, status: :ok, location: @task }
else
format.html { render :edit }
format.json { render json: @task.errors, status: :unprocessable_entity }
end
end
end
答案 0 :(得分:0)
首先,这条路线不是必需的,因为resources :tasks
已经为你创建了
match 'jobs/:job_id/tasks', to: "jobs/tasks#index", via: :get
其次,在表单中你是错误的工作:job_tasks_path
应该是job_tasks_path(@job)
答案 1 :(得分:0)
要了解如何调试此错误,您可以从终端中运行rake路由开始。输出看起来像
Prefix Verb URI Pattern Controller#Action
job_tasks GET /jobs/:job_id/tasks(.:format) tasks#index
POST /jobs/:job_id/tasks(.:format) tasks#create
new_job_task GET /jobs/:job_id/tasks/new(.:format) tasks#new
edit_job_task GET /jobs/:job_id/tasks/:id/edit(.:format) tasks#edit
job_task GET /jobs/:job_id/tasks/:id(.:format) tasks#show
PATCH /jobs/:job_id/tasks/:id(.:format) tasks#update
PUT /jobs/:job_id/tasks/:id(.:format) tasks#update
DELETE /jobs/:job_id/tasks/:id(.:format) tasks#destroy
jobs GET /jobs(.:format) jobs#index
POST /jobs(.:format) jobs#create
new_job GET /jobs/new(.:format) jobs#new
edit_job GET /jobs/:id/edit(.:format) jobs#edit
job GET /jobs/:id(.:format) jobs#show
PATCH /jobs/:id(.:format) jobs#update
PUT /jobs/:id(.:format) jobs#update
DELETE /jobs/:id(.:format) jobs#destroy
左侧列为您提供路线的名称。您可以在视图和控制器中将其引用为job_tasks_path或job_tasks_url,基本上将_path或_url附加到命名路由。下一列为您提供HTTP动词。请注意,对于update和destroy,您需要分别指定动词PATCH或PUT和DELETE。这就是rails将其请求与HTTP请求进行匹配的方式。下一列显示uri采用的格式,最右列显示路径如何与控制器和操作匹配。冒号表示需要提供参数。
job_tasks会将请求发送到任务控制器中的索引操作,并期望提供job_id参数,您可以通过params [:job_id]访问该参数。
您收到的错误表明您的表单正在尝试发布到不存在的uri。 [PATCH] / jobs / 2 / tasks不存在,但[PATCH]“/ jobs / job_id / tasks /:id确实存在。将form_tag更改为
<%= form_for @task, url: job_tasks_path(@job) do |f| %>
或
<%= form_for([@job, @task]) do |f| %>
答案 2 :(得分:0)
如果您想了解有关嵌套资源的更多信息,下面的链接就是我第一次尝试嵌套资源时所遵循的一个很好的例子:
(它有点旧,所以你可能不得不自己更新一些代码)
在rails 3上的ruby中创建嵌套资源并更新脚手架链接和重定向:
https://gist.github.com/jhjguxin/3074080