Rails中的动态命名路由

时间:2013-11-26 20:30:01

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

我有一个简单的问题,其中routes / url名称由用户角色决定。目前显示的路线为/new_admin/dispensaries。如果用户具有经理或执行人员的角色,则指定的路线应为“/ dashboards / dispensaries”。

这很简单但很困难的是我的routes.rb:

命名空间:new_admin do     资源:vendor_templates     资源:markdown_docs     资源:email_lists

namespace :moderation do
  resources :reported_reviews
end

resources :users do
  member do
    get :user_bans
    post :ban_unban, to: 'user_bans#create'
    delete :ban_unban, to: 'user_bans#destroy'
  end
end

# TODO - this should be written generically to support dispensary/doctors/whatever
get '/dispensaries/reviews', :to => "reviews#all", :as => :all_reviews
get '/dispensaries/pictures', :to => "pictures#all", :as => :all_pictures
get '/dispensaries/videos', :to => "videos#all", :as => :all_videos
get "/dispensaries/autocomplete", to: "dispensaries#autocomplete"

resources :vendors do
  resources :ownership_transfers, only: [:new, :create]
end
...

我有点陷入困境,因为如果我更改new_admin路由,那么很多其他路由都会受到影响。伙计们好吗?

1 个答案:

答案 0 :(得分:0)

我们实际上做过这样的事情。它并不漂亮,但这个解决方案对我们有用:


<强>蛞蝓

您基本上是指一种名为Slugs的路线。这是您使用名称而不是ID的地方,允许您创建用户友好的路线(例如/delivery/today)。问题是,为了创建这些路由,您必须在路径文件

中单独定义它们

您可以使用两种宝石来处理您的迷路 - FriendlyID&amp; Slugalicious。这两个都允许你创建slugged路线,但FriendlyID基本上只是改变ID,而Slugalicious是一个完全独立的系统

我们在下面的代码中使用了Slugalicious,但是,您可能需要FriendlyID(有一个RailsCast for it here):

enter image description here


<强>路由

您遇到的问题是路由超出了RESTful控制器接口的范围,这意味着您必须在routes.rb文件中调用除resources引用之外的所有路由

如果您使用Slugalicious,它有自己的Slugs数据库,这意味着我们可以使用它来动态创建路由,如下所示:

  #Slugs
  begin  
          Slug.all.each do |s|
                begin
                  get "#{s.slug}" => "#{s.sluggable_type.downcase.pluralize}#show", :id => s.slug
                rescue
                end
          end
  rescue
  end

这是实时代码,并动态输出routes文件中的所有slug。我们设法以编程方式更新它的方法是使用像这样的Observer类:

class SlugObserver < ActiveRecord::Observer
  def after_save(slug)
    Rails.application.reload_routes!
  end

  def after_destroy(slug)
    Rails.application.reload_routes!
  end
end

我感谢您可能已经得到了答案,但是因为您是初学者,我觉得我可以通过为您解释slug来帮助我们