Проблемы маршрутизации с двойным пространством имен - PullRequest
2 голосов
/ 21 декабря 2011

Я пытаюсь следовать этому примеру. Я создал действие в моем контроллере:

  def distribute_resume
    Rails.logger.info(distribution_id.to_s)
    PartnerNotifier.distribute_resume(distribution_id)
    flash[:notice] = "Successfully distributed resume"
    redirect_to admin_distributions_workflows_path
  end

и я создал маршрут в моем файле `config / rout.rb ':

  namespace :admin do
    namespace :distributions do
      resources :workflows do
        collection do
          post :edit_multiple
          put :update_multiple
          post :distribute_resume
        end
      end
    end
  end

Я также попытался переместить маршрут к действию за пределы блока сбора следующим образом:

  namespace :admin do
    namespace :distributions do
      resources :workflows do
        post :distribute_resume
        collection do
          post :edit_multiple
          put :update_multiple
        end
      end
    end
  end 

Но я получаю эту ошибку в обоих случаях:

No route matches {:controller=>"admin/distributions/workflows_controller", :distribution_id=>123, :action=>"distribute_resume", :method=>:post}

Я слишком зеленый, чтобы понять это.

Обновление:

ах да, нужно помнить, чтобы чаще проверять rake routes. Я вижу это:

admin_distributions_workflow_distribute_resume POST   /admin/distributions/workflows/:workflow_id/distribute_resume(.:format) {:action=>"distribute_resume", :controller=>"admin/distributions/workflows"}

поэтому я изменил свое мнение:

      <%=link_to "Send this resume to #{distribution.matching_profile.partner.email}",
            :controller => "workflows", <-- instead of "workflows_controller"
            :action => "distribute_resume",
            :distribution_id => distribution.id,
            :method => :post%>

но я все еще получаю похожее сообщение об ошибке:

No route matches {:controller=>"admin/distributions/workflows", :distribution_id=>121, :action=>"distribute_resume", :method=>:post}

Ответы [ 2 ]

1 голос
/ 21 декабря 2011

У вас есть distribute_resume действие в качестве участника, а не коллекция, действие. Это то, что вы хотели? Вы называете это так, как если бы это было действие по сбору.

Итак, либо переместите объявление маршрута в часть collection do (если оно должно быть действием сбора), либо передайте идентификатор рабочего процесса в вашем перенаправлении.

В любом случае вам также придется переименовать ваш путь перенаправления, потому что он на самом деле не вызывает действие distribute_resume, он вызывает действие индекса.

В настоящее время у вас есть:

redirect_to admin_distributions_workflows_path

И это нужно будет переименовать во что-то подобное (сборная версия):

redirect_to admin_distributions_workflows_distribute_resume_path

или (версия для участника):

redirect_to admin_distributions_workflows_distribute_resume_path(@some_workflow_or_distribution_object)
1 голос
/ 21 декабря 2011

Два выпуска:

Первый

Вы не передаете :workflow_id во время запроса POST. Если вы посмотрите на свои rake routes результаты, вы увидите, что это необходимо:

/admin/distributions/workflows/:workflow_id/distribute_resume(.:format)

Второй

Когда вы задаете пространство имен для таких маршрутов, вы говорите, что вы также отразили это пространство имен в Контроллере.

So

namespace :admin do
  namespace :distributions do
    resources :workflows do
    end
  end
end

Означает, что вам нужно сделать это в вашем контроллере:

class Admin::Distributions::WorkflowsController < ApplicationController
  # controller code goes here
end

Если вы не хотите так именовать свои контроллеры, то вам нужно переключить синтаксис маршрутизации на:

scope "/admin" do
  scope "/distributions" do
    resources :workflows do
    end
  end
end

, которая все еще даст вам ту же схему маршрутизации, но не заставит вас делать префиксы модуля контроллера, как раньше. Имейте в виду, что если вы переключитесь на метод с заданной областью, ваши пути будут изменены, поэтому наберите rake routes, чтобы получить новые.

Подробнее: http://guides.rubyonrails.org/routing.html#controller-namespaces-and-routing


Обновление:

Я думаю, вы делаете это немного сложнее, чем нужно. Ваш link_to можно упростить до этого:

<% =link_to "Send this resume to #{distribution.matching_profile.partner.email}",
            admin_distributions_workflow_distribute_resume_path(distribution.id),
            :remote => true,
            :method => :post %>
...