Как ВЫСУШИТЬ эти маршруты

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

Есть ли какой-либо способ высушить эти маршруты. Для них есть шаблон:

 get "articles/new" => "articles#new", :as => :new_article
post "articles/new" => "articles#create", :as => :create_article
get "articles/:slug/edit" => "articles#edit", :as => :edit_article

get "stores/:id/articles/new" => "articles#new", :as => :new_store_article, :defaults => { :scope => 'store' }
post "stores/:id/articles/new" => "articles#create", :as => :create_store_article, :defaults => { :scope => 'store' }
get "stores/:id/articles/:slug/edit" => "articles#edit", :as => :edit_store_article, :defaults => { :scope => 'store' }

get "warehouses/:id/articles/new" => "articles#new", :as => :new_warehouse_article, :defaults => { :scope => 'warehouse' }
post "warehouses/:id/articles/new" => "articles#create", :as => :create_warehouse_article, :defaults => { :scope => 'warehouse' }
get "warehouses/:id/articles/:slug/edit" => "articles#edit", :as => :edit_warehouse_article, :defaults => { :scope => 'warehouse' }
  

Заранее спасибо!

Ответ №1:

Отличается ли slug в ваших статьях от article_id? Попробуйте добавить приведенное ниже в свою модель статьи:

 #This overrides the :id in your routes, and uses the slug instead
def to_param
  slug
end
  

Тогда в ваших маршрутах должно работать следующее.

 resources :articles, :only => [:new, :create, :edit]
scope :stores do
  resources :articles, :only => [:new, :create, :edit]
end
scope :warehouses
  resources :articles, :only => [:new, :create, :edit]
end
  

Я настоятельно рекомендую прочитатьhttp://guides.rubyonrails.org/routing.html

Комментарии:

1. Что, если я не хочу использовать ресурсы (я планирую добавить много разных действий, кроме RESTful)? И как бы я решил проблему параметров по умолчанию :defaults => { :scope => '...' }

Ответ №2:

Я хотел элегантное решение, и я, кажется, нашел его. В принципе, добавление вспомогательного метода, который я могу использовать в моем файле маршрутов, поместив это в lib/routes_helper.rb :

 class ActionDispatch::Routing::Mapper
  def article_resources_for(scope = nil)
    scope_path_symbol = scope_path = nil
    defaults = {}

    unless scope.blank?
      scope_path = "#{scope}/:id/"
      scope_path_symbol = "#{scope}_"
      defaults = { :defaults => { :scope => scope } }

    get "#{scope_path}articles/new" => "articles#new", { :as => :"new_#{scope_path_symbol}article" }.merge(defaults)
    post "#{scope_path}articles/new" => "articles#create", { :as => :"create_#{scope_path_symbol}article" }.merge(defaults)
    get "#{scope_path}articles/:slug/edit" => "articles#edit", { :as => :"edit_#{scope_path_symbol}article" }.merge(defaults)

  end
end
  

Затем в моем routes.rb файле я могу просто сделать

 article_resources_for
article_resources_for "stores"
article_resources_for "warehouses"