【问题标题】:Ruby on Rails Routing AliasRuby on Rails 路由别名
【发布时间】:2013-09-17 18:28:48
【问题描述】:

我正在尝试将路由别名添加到 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

似乎它被路由到了正确的方法,但似乎出现了缓存(?)错误。

我还将完整的跟踪记录作为要点:

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

【问题讨论】:

  • 你能发布引发错误的行吗?也许堆栈跟踪也是
  • 我已经在上面添加了完整的跟踪。
  • 你的控制器的第 13 行是什么?
  • @format = 'ajax_form' #不过也说“in `show'”,但是没有show方法。我假设 show 是由 Ruby on Rails 自动创建的?
  • 是的,它是通过 routes.rb 文件中的资源方法生成的。它生成 CRUD 操作减去“除外”操作,或仅生成“仅”选项中包含的操作(在您的情况下,索引和显示)

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


【解决方案1】:

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

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 不同的参数名称。

它应该是您通常使用值“sandwiches”传递的任何参数。

没有看到你的模型,我猜不出那是什么。 (标签?,名字?,)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 2018-12-28
    • 2011-05-11
    相关资源
    最近更新 更多