没有路由匹配[PATCH]“/ jobs / 2 / tasks”

时间:2016-04-18 17:45:49

标签: ruby-on-rails nested

我是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

3 个答案:

答案 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