gpt4 book ai didi

ruby-on-rails - 路由约束问题。为什么这不起作用,或者我如何在 Rails 3.1 中有多个几乎相同的约束?

转载 作者:行者123 更新时间:2023-12-04 06:11:48 27 4
gpt4 key购买 nike

我有几个属于一个类型和一个类别的出版物(帖子),我想要这样的路线:

  • /some-type-slug
  • /some-type-slug/some-category-slug
  • /some-category-slug

  • 所有这些都指向publications#index,我在这里做所有的过滤

    只要我只尝试使用类型和可选类别,它就可以很好地使用:

    scope ':type', :constraints => lambda{|req| PublicationType.all.map(&:slug).include?(req.params[:type].singularize) } do
    match 'new' => 'publications#new'
    match '(/:category)' => 'publications#index'
    end

    但是,当我添加了关于类别的相同代码时,我尝试转到“/some-category”,结果却无法正常工作:

    match ':category' => 'publications#index', :constraints => lambda{|req| Category.all.map(&:slug).include?(req.params[:category].singularize) }

    造成 :
    NoMethodError in PublicationsController#index

    undefined method `singularize' for nil:NilClass

    Parameters:

    {"type"=>"some-category-slug"}

    好的,因为 params[:category] ​​为零,所以抛出 NoMethodError 。这是因为 URL 的 :category 部分刚刚被之前的路由定义“偷走了”:params[:type] 是用 URL 的 :category 部分设置的。

    所以我想知道这是否是 Rails 路由器中的一个错误,或者我只是想把它推得太远。如果我愿意,我想知道实现相同结果的其他选择是什么。

    谢谢 !

    最佳答案

    我明白你想做什么,但我认为你在危险的地方,试图匹配这样的路线。

    你正在做的事情也可以这样实现。

    match ":slug" => "slugs#show"

    class SlugsController

    def show
    if type = PublicationType.find_by_slug(params[:slug])
    ...
    elsif category = Category.find_by_slug(params[:slug])
    ...
    else
    render_404
    end
    end
    end

    (有关 how to render a 404 的精彩讨论,请参阅此答案)

    它可能看起来太过分了
    但这实际上是您正在做的事情。

    你只是在你的路由文件中使用 lambdas 来完成它。

    我建议您重新考虑您的网址策略。
    /cat/some-slug
    /type/some-slug

    没那么糟糕。

    关于ruby-on-rails - 路由约束问题。为什么这不起作用,或者我如何在 Rails 3.1 中有多个几乎相同的约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7689681/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com