#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"