【问题标题】:Double namespaced routing issues双命名空间路由问题
【发布时间】:2012-01-25 10:37:11
【问题描述】:

我正在尝试遵循 this 的示例。 我在控制器中创建了一个动作:

  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/routes.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}

【问题讨论】:

  • 在控制台输入rake routes会得到什么?
  • 在 OP 底部添加了更新

标签: ruby-on-rails ruby-on-rails-3 namespaces controller routes


【解决方案1】:

两个问题:

第一

您在 POST 请求期间没有传入 :workflow_id。如果您查看您的 rake routes 结果,您会发现这是必要的:

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

第二

当您像这样为路由命名时,您是在告诉它您也在控制器中反映了该命名空间。

所以

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 %>

【讨论】:

  • 这几乎正是我的控制器所拥有的:class Admin::Distributions::WorkflowsController &lt; Admin::BaseController
  • 更新的答案,您也没有在 POST 请求期间传递 :workflow_id
  • 所以,我将我的 link_to 更改为:` "workflows", :action => "distribute_resume", :workflow_id => distribution.id %>` 但我现在收到此错误:undefined local variable or method 'workflow_id' for #&lt;Admin::Distributions::WorkflowsController:0x139758e30&gt;
  • 我需要做些什么来让我的控制器知道“workflow_id”吗?
  • 查看我的帖子底部,了解如何简化您的link_to。您应该将 distribution.id 传递给 rails 为您生成的路径助手。
【解决方案2】:

您将distribute_resume 操作作为成员,而不是集合,操作。这是你想要的吗?您将其称为收集操作。

所以,要么将你的路由声明移到 collection do 部分(如果它应该是一个收集操作),要么在你的重定向中传递一个工作流 ID。

无论哪种方式,您都必须重命名重定向路径,因为它实际上并没有调用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)

【讨论】:

  • 我的重定向路径需要在哪里重命名?我不太关注你。
  • 更新了我的答案。您没有在路径中包含操作的名称,因此 Rails 不知道您在说什么。
  • hmm....其他事情正在发生,我现在收到此错误undefined local variable or method 'workflow_id' for #&lt;Admin::Distributions::WorkflowsController:0x139c15f68&gt;,无论我的“redirect_to”是什么
  • 你在这里遗漏了一些非常基本的东西。如果你加入聊天可能会更容易,我们可以讨论它:chat.stackoverflow.com/rooms/info/6044/…
  • @Normalicity 我认为 Ramy 只是在 distribute_resume 操作中成功通过电子邮件发送简历后重定向到 index 操作,因此它在 OP 中的方式是正确的。也许我误解了意图。
猜你喜欢
  • 2023-03-25
  • 2017-12-13
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 2018-05-05
相关资源
最近更新 更多