【问题标题】:How to avoid resolving a route in rails?如何避免解决rails中的路线?
【发布时间】:2011-06-14 20:50:33
【问题描述】:

我正在开发一个带有管理部分和公共部分的 Rails 应用程序。在公共部分,我只想解析索引并显示路线

resources :services, :only => [:index, :show]

但是,当我点击新操作的标准 URL 时,它会解析为 ID 为“新”的显示操作。即http://foo.com/services/new 返回错误“找不到 ID=new 的服务”。无论如何我可以告诉 rails 不要解析 /services/new 吗?

我已经试过了

resources :services, :only => [:index, :show], :except => :new

resources :services, :except => :new, :only => [:index, :show]

没有成功。

预计到达时间(根据要求): 我的整个路线文件(无 cmets):

MyApp::Application.routes.draw do
  resources :services, :only => [:index, :show]
  resources :packages,:only => [:index, :show]

  get "pages/home"
  get "pages/about"
  get "pages/help"

  root :to => 'packages#index'

  namespace "admin" do
    get "pages/home"
    get "pages/about"
    get "pages/help"

    resources :services
    match "/services/:id/add_to_package/:package_id" => "services#add_package",       :as => :add_package_to_service,      :via => :post, :id => /\d+/, :package_id => /\d+/
    match "/services/:id/remove_from_package/:package_id" => "services#remove_package", :as => :remove_package_from_service, :via => :post, :id => /\d+/, :package_id => /\d+/

    resources :packages 
    match "/packages/:id/add_service/:service_id" => "packages#add_service",       :as => :add_service_to_package,      :via => :post, :id => /\d+/, :service_id => /\d+/
    match "/packages/:id/remove_service/:service_id" => "packages#remove_service", :as => :remove_service_from_package, :via => :post, :id => /\d+/, :service_id => /\d+/

    resources :users

    root :to => 'pages#home'
  end
end

【问题讨论】:

  • 我会在路由文件或控制器中使用redirect,因为通常会考虑 url
  • 你能发布整个路线文件吗?
  • 也许我看错了,但是“不解决路线”是指返回 404?在生产模式下,如果你在做 Service.find(params[:id),那么“Couldn't find Service with ID=new”将被替换为 404 .... 所以它的基本目的是相同的,告诉世界这个页面不存在。
  • 我可能会从我的主要项目中走出来,但我正在尝试使用 rspec 解决测试问题 - 具体来说,我正在尝试让 { :get => "/service_packages/new" }.should_not be_routable 通过(不破坏其他测试)

标签: ruby-on-rails routing url-routing new-operator


【解决方案1】:

您可以尝试对 :id 参数施加约束

resources :services, :constraints => {:id => /\d+/}, :only => [:index, :show]

这是假设您的:ids 都是基于数字的。

我遇到了类似的重定向与资源冲突的情况,这解决了它。

【讨论】:

  • 恐怕我正在处理数字和文本 ID,但我想我会进一步探索这条道路......
  • 我以为我有一个与resources :services, :constraints => {:id => /(?!new)\w+/}, :only => [:index, :show] 匹配的负前瞻解决方案,但这也不是诀窍。我可以让它在控制台中工作,但只能使用开始/结束锚点,由于某种原因,这些锚点在路由匹配中是不允许的。
猜你喜欢
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 2018-04-01
相关资源
最近更新 更多