Ruby on Rails 路由别名

3

我正在尝试为 Ruby on Rails 应用程序添加路由别名。这是我的现有路由文件:

scope "/blog" do    
  resources :tags, :path => :tags, :as => :tags, :only => [:index, :show] do
    match 'page/:page' => 'tags#show', :on => :member
  end
end

这对于像以下路由非常有效:

/blog/tags/sandwiches

然而,我想为一些特殊标签添加别名(不需要重定向),这样我就可以像这样引用它们:

/blog/sandwiches

我在我的 /blog 范围内添加了这个匹配语句:

match 'sandwiches' => 'tags#show', :defaults => { :id => 1 }

但是我现在遇到了这个错误:
NoMethodError in TagsController#show

undefined method `cache_key' for nil:NilClass

似乎它被路由到了正确的方法,但是一个缓存错误似乎出现了。
我也将完整的跟踪放在gist上:

https://gist.github.com/whitnelson/6598921


你能贴出引发错误的那一行代码吗?或者也可以附上堆栈跟踪信息。 - MrYoshiji
我已经在上面添加了完整的跟踪。 - Whit
你的控制器的第13行是什么? - MrYoshiji
@format = 'ajax_form' # 然而它也说 "in `show'", 但是没有 show 方法。我猜测 show 是由 Ruby on Rails 自动创建的? - Whit
1
是的,它是通过routes.rb文件中的resources方法生成的。它生成CRUD操作,减去“except”选项中的操作,或者仅包含“only”选项中的操作(在您的情况下,是index和show)。 - MrYoshiji
1个回答

0

我认为你想要的是这样的:

class SpecialTagssConstraint
  require 'set'
  def initialize
    @ok_tags = Set.new(['sandwiches','pastries'])
  end

  def matches?(request)
    @ok_tags.include?(request.params[:id])
  end
end

 ...
    get '/:id', to: 'tags#show', constraints: SpecialTagsConstraint.new

我相信你需要使用一个不同于:id的参数名称。

它应该是你通常传递值“三明治”的任何参数。

如果没有看到你的模型,我无法猜测那是什么。(标签?名称?)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接