【问题标题】:Rails3: Appropriate use of routing and resourcesRails3:合理使用路由和资源
【发布时间】:2010-11-14 16:18:06
【问题描述】:

我最近加入了 Rails 应用程序开发 (Rails3) 的世界,我可能正在滥用资源路由。

默认的资源路由为我经常使用的 URL 提供了一些非常方便的帮助方法。我的问题是我有控制器,我将路由指定为足智多谋只是为了利用这些辅助方法。我有一些与资源无关的基本网站导航。

resource :home do
  member do
    get 'main'
    get 'about'
    get 'login'
    get 'help'
  end
end

有没有更好的方法来做我一直在做的事情?每次我有一个新的控制器操作时不需要我手动添加路由条目的任何东西?

澄清一下,我想为控制器指定路由,而不必显式添加任何新操作,但我也希望它自动生成辅助方法。到目前为止,我必须为我想要的每个操作显式添加路由。我可以通过这样做(以非资源方式)获得类似的东西,

match 'home/about' => 'home#about'

但我不想把不符合约定的每条路线都写出来。

【问题讨论】:

  • 也许我误解了你,但听起来好像你希望它自动通过你的控制器查看公共方法,并为它们创建命名路由。我读对了吗?如果是这样,您似乎在寻求一种连 Rails 都无法提供的魔法。
  • 不,我认为你说得对。举个例子,像“match ':controller(/:action)'”这样的行会自动检测控制器的动作并生成命名路由。我仍在学习 rails 有哪些可用的技巧。另一方面,我不介意有人推荐更好的方法或举一些他们通常如何为他们的应用程序执行此操作的示例。

标签: ruby-on-rails ruby-on-rails-3 routing


【解决方案1】:

这是另一个更简单的。只需在 routes.rb 底部添加一条通用路由即可

match ":controller/:action"

它会直接映射到指定控制器的指定动作。如果你愿意,你可以更具体一点。例如,使用get 而不是match 来限制HTTP GET 请求,指定应用控制器等。

get ":controller/:action", :constraints => { :controller => /home|help/ }

【讨论】:

    【解决方案2】:

    您可以在控制器中查看公共实例方法并自动生成路由。

    # routes.rb
    HomeController.public_instance_methods(false).select{|m| !(m.to_s =~ /^_/)}.each do |m|
      match "home/#{m}", :action => m, :controller => HomeController, :as => "home_#{m}"
    end
    

    这将从您的控制器中获取显式(非继承)公共实例方法,并选择那些以下划线开头的方法(因为下划线是过滤器的生成方法,其余都是实际行动)。然后它会为每个生成一个命名路由。

    请记住,routes.rb 仅在服务器启动时处理,因此您必须在添加新操作后重新启动服务器。

    【讨论】:

    • 这就是我现在正在研究的内容。不要进一步逼迫您,但是如何以更通用的方式完成此操作,以便我可以将任何控制器名称传递给它?例如(假设它正在调用您定义的方法), generate_named_routes :home。我试图弄清楚 Rails 中是否已经存在可以将 :home 转换为 HomeController 的代码。那么有一个通用的方法来生成命名路由就很简单了。
    • 尝试"#{my_symbol.to_s.classify}Controller".constantize 将符号转换为其对应的控制器类。您可以将该类放在一个变量中并使用它,而不是像上面那样直接指定控制器。
    • 感谢您的指导!我确实最终这样做了,但为了增加我的故事,我有一个可怕的疏忽。这依赖于控制器上存在的操作方法。在某些情况下,我有一个没有为其定义操作方法的视图......我正在使用 Rails 的视图自动映射。如果我想更进一步,我必须对视图、操作方法等进行一些嗅探。Can o' worms。突然间,只需使用“匹配'家/关于'”就很容易了。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 2012-02-09
    • 1970-01-01
    • 2013-01-31
    • 2011-04-17
    相关资源
    最近更新 更多