【问题标题】:Rails 3 Routes: DRY membersRails 3 路线:DRY 成员
【发布时间】:2010-11-24 02:31:51
【问题描述】:

我需要在一些资源中添加以下成员方法,有没有办法把它干掉?

 member do
    get   :votes
    post  :up_vote
    post  :down_vote
  end

在我的 routes.rb 中

resources :news do
  resources :comments do
     member do
        get   :votes
        post  :up_vote
        post  :down_vote
      end
  end
end

resources :downloads do
  resources :whatever do
     member do
        get   :votes
        post  :up_vote
        post  :down_vote
      end
  end
end

编辑

我实际上已经把它移到了这样的模块中:

module Votable
  module RoutingMethods
    def votable_resources
      member do
        get   "up_votes"
        get   "down_votes"
        post  "up_vote"
        post  "down_vote"
      end
    end
  end # RoutingMethods
end

现在,我的 routes.rb 看起来像这样:

require 'votable'

include Votable::RoutingMethods

MyApp::Application.routes.draw do

  namespace :main, :path => "/" do
    resources :users do 
      resources :comments do
        votable_resources
      end
    end
  end

end

查看我的内联 cmets,但我希望命名路由看起来像:main_users_comments_up_votes

【问题讨论】:

  • 请看我的编辑。你能用你如何做命名路线来编辑你的问题吗?
  • 在 'resources :cmets' 中嵌套 'votable_resources :cmets' 会让你更接近吗?
  • 刚刚做了另一个编辑。将其嵌套在 resources :comments 中的问题是 RESTful 操作对我不利。
  • 我回去简化了,太复杂了。不确定 named_routes 是怎么回事,但我认为它与原始问题无关。
  • 'main_users_cmets_up_votes' 的控制器和操作是什么?

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


【解决方案1】:

你不能在你的路由文件中定义一个方法吗?

def foo
  member do
   get   :votes
   post  :up_vote
   post  :down_vote
  end
end


resources :news do
 resources :comments do
   foo
 end
end

编辑

我以前没有使用过这种技术。当我做'rake routes'时,它似乎起作用了。无论如何,路由文件只是 Ruby 代码。请注意您定义的方法的名称,因为它是在 ActionDispatch::Routing::Mapper 的实例中定义的。

# routes.rb

MyApp::Application.routes.draw do
  puts self
  puts y self.methods.sort
end

# Terminal
> rake routes

【讨论】:

  • 我遇到的一个问题是将其保持在命名路由的范围内。正在考虑使用 Procs。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多