Rails 3路由范围和/或嵌套

时间:2011-02-26 04:12:07

标签: ruby-on-rails-3 routing scope nested permalinks

我无法确定我不想筑巢的路线。

我有以下路线:

  resources :foos
  resources :bars
  resources :bazs do
    resources :hellos
    resources :worlds
  end

foo,bar和baz模型都属于用户模型。我不想嵌套另一个图层,但我确实希望在我的网址中有一个前缀,该前缀对应于用户的永久链接属性(类似于每个以用户名为前缀的github repo)。所以我在所有控制器上都有一个过滤器

  def get_scope
    @user = User.find_by_permalink(params[:permalink])
  end

感谢@cowboycoded

修改了to_param
  class User < ActiveRecord::Base  
    def to_param
      permalink
    end
  end

我用

包裹了这些路线
  scope ":permalink", :as => :user do
    #nested routes here
  end

现在一切正常,只要我将@user传递给每个非索引路由。当它已经是作用域时,必须回到我的所有视图并用(@ user,@ foo)替换(@foo)并不是非常干燥。

除非我弄错了,否则to_param方法只是替换:id,以便/ users /:id等网址显示为users / permalink而不是users / 1。我尝试使用这个:我的范围内的id,但它与foo&#39; s param冲突并且打破了一切。也许我错过了与路径的联系?

感谢您提出的任何建议!

1 个答案:

答案 0 :(得分:3)

您是否尝试在模型中使用to_param方法?这将允许您覆盖默认值并使用除id之外的其他内容,并将使用URL帮助程序

http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-i-to_param

文档示例:

class User < ActiveRecord::Base
  def to_param  # overridden
    name
  end
end

user = User.find_by_name('Phusion')
user_path(user)  # => "/users/Phusion"

我不确定这与范围有多好,因为我没有尝试过,但我想它值得一试。