Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 有没有更好的方法在Rails路线中执行这些约束?_Ruby On Rails_Ruby On Rails 3_Routes - Fatal编程技术网

Ruby on rails 有没有更好的方法在Rails路线中执行这些约束?

Ruby on rails 有没有更好的方法在Rails路线中执行这些约束?,ruby-on-rails,ruby-on-rails-3,routes,Ruby On Rails,Ruby On Rails 3,Routes,我的routes文件中有一半以上是约束(及其类),因此我想知道是否有更好的方法来实现这一点。如果我添加其他宠物,每个宠物都是一样的,所以文件可能会很长 class AkcConstraint TYPES = %w[sporting-group hound-group working-group terrier-group toy-group non-sporting-group herding-group misc-class] def self.matches?(request)

我的routes文件中有一半以上是约束(及其类),因此我想知道是否有更好的方法来实现这一点。如果我添加其他宠物,每个宠物都是一样的,所以文件可能会很长

class AkcConstraint
  TYPES = %w[sporting-group hound-group working-group terrier-group toy-group non-sporting-group herding-group misc-class]
  def self.matches?(request)
    TYPES.include? request.path_parameters[:akc_group]
  end
end

class AnkcConstraint
  TYPES = %w[toy-group terrier-group gundog-group hound-group working-group utility-group non-sporting-group]
  def self.matches?(request)
    TYPES.include? request.path_parameters[:ankc_group]
  end
end

class CkcConstraint
  TYPES = %w[sporting-group hound-group working-group terrier-group toy-group non-sporting-group herding-group]
  def self.matches?(request)
    TYPES.include? request.path_parameters[:ckc_group]
  end
end

class FciConstraint
  TYPES = %w[group-1 group-2 group-3 group-4 group-5 group-6 group-7 group-8 group-9 group-10]
  def self.matches?(request)
    TYPES.include? request.path_parameters[:fci_group]
  end
end

class IkcConstraint
  TYPES = %w[group-1 group-2 group-3 group-4 group-5 group-6 group-7 group-8 group-9 group-10]
  def self.matches?(request)
    TYPES.include? request.path_parameters[:ikc_group]
  end
end

class KcConstraint
  TYPES = %w[hound-group working-group gundog-group terrier-group utility-group pastoral-group toy-group]
  def self.matches?(request)
    TYPES.include? request.path_parameters[:kc_group]
  end
end

class KusaConstraint
  TYPES = %w[hound-group working-group gundog-group terrier-group utility-group pastoral-group toy-group]
  def self.matches?(request)
    TYPES.include? request.path_parameters[:kusa_group]
  end
end

class NzkcConstraint
  TYPES = %w[toy-group terrier-group gundog-group hound-group working-group utility-group non-sporting-group]
  def self.matches?(request)
    TYPES.include? request.path_parameters[:nzkc_group]
  end
end


# For dog groups and types
match 'dogs/akc/:akc_group', :to => "dogs#index", :as => "akc_dogs",
                        :constraints => AkcConstraint
match 'dogs/ankc/:ankc_group', :to => "dogs#index", :as => "ankc_dogs",
                        :constraints => AnkcConstraint
match 'dogs/ckc/:ckc_group', :to => "dogs#index", :as => "ckc_dogs",
                        :constraints => CkcConstraint
match 'dogs/fci/:fci_group', :to => "dogs#index", :as => "fci_dogs",
                        :constraints => FciConstraint
match 'dogs/ikc/:ikc_group', :to => "dogs#index", :as => "ikc_dogs",
                        :constraints => IkcConstraint
match 'dogs/kc/:kc_group', :to => "dogs#index", :as => "kc_dogs",
                        :constraints => KcConstraint
match 'dogs/kusa/:kusa_group', :to => "dogs#index", :as => "kusa_dogs",
                        :constraints => KusaConstraint
match 'dogs/nzkc/:nzkc_group', :to => "dogs#index", :as => "nzkc_dogs",
                        :constraints => NzkcConstraint

我想我最关心的是性能——我应该担心吗?有更好的方法吗?

假设
Akc
Ankc
Ckc
,等等。所有这些都继承自同一个模型,例如
Club
(我当然希望他们这样做),那么你肯定可以使其更简洁,至少可能更高效。大概是这样的:

class ClubConstraint
  Types = { # in actuality this should come from your database and not be
            # hard-coded; otherwise it's going to be a big maintenance headache
    :akc  => %w[ sporting-group  hound-group    working-group
                 terrier-group   toy-group      non-sporting-group
                 herding-group   misc-class ],
    # ...
    :nzkc => %w[ toy-group       terrier-group  gundog-group
                 hound-group     working-group  utility-group
                 non-sporting-group ],
  }.freeze

  def matches? request
    pparams = request.path_parameters
    return unless club_groups = Types[ pparams[ :club ] ]

    club_groups.include? pparams[ :group ]
  end
end

# For dog groups and types
match 'dogs/:club/:group', :to => "dogs#index",
      :constraints => ClubConstraint.new

由于我还没有测试过它(你的
:as=>
选项需要重新实现),这可能无法像编写的那样工作,但你已经明白了这个想法。

假设
Akc
Ankc
Ckc
,等等。所有这些都是从同一个模型继承的,例如
俱乐部
(我当然希望他们会这么做),那么你当然可以让它更简洁,至少,而且可能更有效。大概是这样的:

class ClubConstraint
  Types = { # in actuality this should come from your database and not be
            # hard-coded; otherwise it's going to be a big maintenance headache
    :akc  => %w[ sporting-group  hound-group    working-group
                 terrier-group   toy-group      non-sporting-group
                 herding-group   misc-class ],
    # ...
    :nzkc => %w[ toy-group       terrier-group  gundog-group
                 hound-group     working-group  utility-group
                 non-sporting-group ],
  }.freeze

  def matches? request
    pparams = request.path_parameters
    return unless club_groups = Types[ pparams[ :club ] ]

    club_groups.include? pparams[ :group ]
  end
end

# For dog groups and types
match 'dogs/:club/:group', :to => "dogs#index",
      :constraints => ClubConstraint.new

由于我还没有测试过它(您的
:as=>
选项需要重新实现),所以这可能无法像编写的那样工作,但您已经明白了这个想法。

您似乎正在尝试通过路由实现slug。也许看看,等等,嗨,安德鲁,它们不是AR模型,只是狗模型中的字段(和值)。我确实考虑创建一个“注册表”模型,但是这将引入另一个元素到URL(如狗/注册/ AKC /工作犬等)中,如果可能的话,我想避免。这似乎是你试图通过路径实现蛞蝓。也许看看,等等,嗨,安德鲁,它们不是AR模型,只是狗模型中的字段(和值)。我确实考虑创建一个“注册表”模型,但是这将引入另一个元素到URL中(如狗/注册/ AKC/Work狗熊等),如果可能的话,我想避免。嗨,约旦,谢谢你的回答。它们不是AR模型,只是Dog模型中的字段和值。正如我提到的安得烈,我确实考虑创建一个“注册表”模型,但这将引入另一个元素到URL(如狗/注册表/ AKC /工作犬等),如果可能的话,我想避免。拔出俱乐部到URL PARAM会很好地工作。这就是我的建议。没有必要将类型移动到模型中,因为您可能不太可能经常更改这些类型。为了更新它们,你将被迫进行部署。好吧……终于得到了!玩弄了不同的方法,包括“多态”HABTM(加入模式上的pm-用于俱乐部和狗/猫),但它实在太过时了。所以最终创建了两个模型,clubs&Group,然后使用了Jordan和我的旧模型的混合约束,仅需7行代码。我唯一关心的是,当我使用一个模型来存储俱乐部/团体(并因此在routes文件中调用此模型)时,这是否意味着每次向站点发送请求时,db都会被命中?或者Rails会像这样缓存路由查询吗?我应该担心吗?谢谢你们的帮助,伙计们!(PS很抱歉延迟回复您-我想等到有值得报告的内容时再回复!)AFAIK in production Rails在服务器启动时运行一次
routes.rb
。它会在每个相关请求上调用
匹配?
,但只要您在此之前加载对象,例如,在创建类时,我认为您不必担心。嗨,Jordan,谢谢您的回答。它们不是AR模型,只是Dog模型中的字段和值。正如我提到的安得烈,我确实考虑创建一个“注册表”模型,但这将引入另一个元素到URL(如狗/注册表/ AKC /工作犬等),如果可能的话,我想避免。拔出俱乐部到URL PARAM会很好地工作。这就是我的建议。没有必要将类型移动到模型中,因为您可能不太可能经常更改这些类型。为了更新它们,你将被迫进行部署。好吧……终于得到了!玩弄了不同的方法,包括“多态”HABTM(加入模式上的pm-用于俱乐部和狗/猫),但它实在太过时了。所以最终创建了两个模型,clubs&Group,然后使用了Jordan和我的旧模型的混合约束,仅需7行代码。我唯一关心的是,当我使用一个模型来存储俱乐部/团体(并因此在routes文件中调用此模型)时,这是否意味着每次向站点发送请求时,db都会被命中?或者Rails会像这样缓存路由查询吗?我应该担心吗?谢谢你们的帮助,伙计们!(PS很抱歉延迟回复您-我想等到有值得报告的内容时再回复!)AFAIK in production Rails在服务器启动时运行一次
routes.rb
。它会在每个相关请求上调用
匹配?
,但只要您在此之前加载对象,例如在创建类时,我认为您就不必担心。