【问题标题】:URL helper for a post route in a resource资源中发布路由的 URL 帮助程序
【发布时间】:2011-06-21 20:37:10
【问题描述】:

我有一个资源丰富的路由,其中​​嵌套了 post 路由:

resources :groups, :only => [:index, :show] do
  post 'send_audit_reminder', :on => :member
end

如果我运行rake routes,这条路线显示得很好:

send_audit_reminder_group POST   /groups/:id/send_audit_reminder(.:format)
          {:controller=>"groups", :action=>"send_audit_reminder"}

但是,我似乎不知道如何引用给定路由的send_audit_reminder URL。我试过send_audit_reminder_group_path(@group)send_audit_reminder_url(@group),它们都给我以下错误:

No route matches {:controller=>"groups", :action=>"send_audit_reminder"}

rake routes可以看出,确实有匹配这些参数的路由,控制器上也有匹配方法。

如何找到此路由的路径或 URL?我不想对其进行硬编码,因为我们的应用程序部署在同一虚拟主机上的子目录中,因此硬编码的绝对路径不起作用。

我将来会在哪里寻找有关这方面的文档或信息?由于这些路径和 URL 辅助方法是从我的路由生成的,我显然无法查找文档,虽然 rake routes 告诉我路由在那里,但当我尝试获取 URL 时它似乎不在那里.

【问题讨论】:

    标签: ruby-on-rails-3 routes


    【解决方案1】:

    可能是您缺少占位符,因此无法路由。以下应该根据您的定义起作用:

    send_audit_reminder_group_path(group)
    

    每当您在路由中看到:id:group_id 之类的标识符时,您必须提供它们,除非它们在括号中,这表明它们是可选的,就像:format 的情况一样。参数需要按照声明它们的顺序提供。为此:

    /example/:user_id/groups/:id
    

    此路由的参数将是 user_idid,并且两者都必须提供。通常对于路由,您可以使用文字数字或字符串,或者支持 to_param 的模型,就像所有 ActiveRecord::Base 派生的一样。

    这一切都源于用:member 声明,这意味着它特定于特定记录,而不是:collection 被省略的地方。 Rails Routing Guide 解释更多。

    【讨论】:

    • 不,我正在传递小组。我会更新我的问题以澄清这一点。
    • 相当棘手,特别是如果定义了@group。您的routes.rb 中没有任何内容可能会阻止该部分运行?没有条件?有时值得向assert_routing 编写功能测试并验证您的自定义路由是否有效。
    • 我的routes.rb 很简单; root :to => redirect("/groups"),一些资源丰富的路线,以及显示的路线,它只是剥离了一些我认为可能无关紧要的嵌套资源,因为它们没有名称冲突的机会。没有任何条件。我会尝试编写功能测试;我的测试基础设施目前似乎已损坏,因此我需要先修复它,然后才能完成。
    • 啊。结果我需要传递group 而不是@group,因为此时我处于group 部分,而不是定义@group 的视图。这只是一个糟糕的错误消息,它应该抱怨一个 nil 参数,而是抱怨一个实际上存在的缺失路线。在我尝试将send_audit_reminder_url 替换为url_for 之后,编写功能测试并发现它有效,这让我得到了答案,这实际上报告了有关正确传递nil 的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 2015-10-14
    • 2013-01-31
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 2015-06-30
    相关资源
    最近更新 更多