将URL与我的应用程序中的资源相关联

时间:2010-05-07 21:14:55

标签: ruby-on-rails

当我在浏览器中访问http://my-application.com/posts/1时,Rails知道我正在寻找Post id = 1。我怎样才能让我的应用程序在内部执行此操作?即,我想要一个函数(称之为associate_with_resource),它接受一个包含URL作为输入的字符串并输出相关的资源。例如:

>> associate_with_resource('http://my-application.com/posts/1')
=> #<Post id: 1, ... >

(我希望能够在整个应用程序中使用associate_with_resource - 不仅仅是在控制台中)

3 个答案:

答案 0 :(得分:1)

我想我正在寻找ActionController::Routing::Routes.recognize_path方法

答案 1 :(得分:1)

你对ActionController::Routing::Routes.recognize_path是正确的,我会这样做:

创建文件lib/associate_with_resource.rb

module AssociateWithResource
  def associate_with_resource(path)
    url_hash = ActionController::Routing::Routes.recognize_path path
    url_hash[:controller].classify.constantize.find(url_hash[:id])
  end
end

class ActionController::Base
  include AssociateWithResource
  helper_method :associate_with_resource
end

class ActiveRecord::Base
  include AssociateWithResource
end

现在,您可以从几乎所有地方调用associate_with_resource(path)来获取属于给定路径的资源

答案 2 :(得分:0)

  

当我在浏览器中访问http://my-application.com/posts/1时,Rails知道我正在寻找id = 1的帖子。

这不正确。

在Rails 3中,将其放入routes.rb

resources :posts

然后Rails会知道文件PostsController中有一个名为app/controllers/posts_controller.rb的控制器。 Rails还会知道,在PostsController课程中,您有七种方法可用作行动方法:indexnewcreateshoweditupdatedelete

您在这些行动方法中所做的完全取决于您。您可能希望检索并显示Post对象。