Избавьтесь от необходимости повторять имя контроллера в маршрутах

#ruby-on-rails #ruby #ruby-on-rails-4

#ruby-on-rails #ruby #ruby-on-rails-4

Вопрос:

У меня есть следующие маршруты:

   get "controller1/aaa" => "controller1#aaa"
  post "controller1/bbb" => "controller1#bbb"
  post "controller1/ccc" => "controller1#ccc"
  get "controller1/ddd" => "controller1#ddd"
 

Есть ли какой-нибудь способ избавиться от необходимости повторять имя контроллера, которое является «controller1»? Это было бы неплохо:

 # not valid routes
with :controller1 do
  get "aaa"
  post "bbb"
  post "ccc"
  get "ddd"
end
 

Ответ №1:

Это можно сделать с помощью

 controller 'controller1', :path => 'controller1' do
  get "aaa"
  post "bbb"
  post "ccc"
  get "ddd"
end
 

Вас также может заинтересовать scope помощник

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

1. как бы мне помогла «область видимости»?

2. потому что вы можете сделать scope :controller => 'controller1' do ...

Ответ №2:

Я считаю, что вы можете сделать следующее:

 get  "controller1/aaa"
post "controller1/bbb"
post "controller1/ccc"
get  "controller1/ddd"
 

Ответ №3:

Вы могли бы использовать некоторую магию метапрограммирования, просто потому, что вы можете:

 [
    [:get, "aaa"],
    [:post, "bbb"],
    [:post, "ccc"],
    [:get, "ddd"],
].each do |method, name|
    send(method, "controller1/#{name}" => "controller1##{name}")
end
 

Конечно, вы могли бы зайти так далеко, чтобы написать метод with , который вы «использовали» в своем вопросе, но это было бы немного сложнее…

Ответ №4:

Вместо этого вы можете использовать resources для определения маршрутов, что тоже рекомендуется.

Если вы просто хотите иметь все семь действий crud для контроллера продуктов ie. индексировать, показывать, создавать, создавать, редактировать, обновлять и удалять вы можете записать как:

 # Sample resource route (maps HTTP verbs to controller actions automatically):
resources :products
 

Если вы хотите добавить дополнительные действия (наряду с 7 действиями по умолчанию), такие как short, toggle, sold и т. Д., В контроллер продуктов, Вы можете сделать что-то вроде этого:

 # Sample resource route with options:
resources :products do
  member do
    get 'short' # This will produce url like /products/[product-id]/short
    post 'toggle'
  end

  collection do
    get 'sold' # This will produce url like /products/sold
  end
end
 

Вы можете использовать only и except как:

 resources :products, only: [:index, :show] # To have only index and show action amp; routes
resources :products, except: [:index, :show] # To leave index and show action amp; routes.
 

Редактировать:
Чтобы получить то, что вы хотите:

 resources :controller1, only: [] do
  collection do
    get :aaa, :ddd
    post :bbb, :ccc
  end
end
 

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

1. Не хотел бы даунвотер поделиться причиной?

2. какое это имеет отношение к «ресурсам»? У меня нет ни одного из 6 методов, которые создают «ресурсы».

3. ОК. спасибо за комментарий. Но не было упомянуто, что вам не нужны какие-либо действия по умолчанию. Но это не был неправильный ответ. Вы можете сделать resources :products, only: [] так, чтобы не создавать маршруты для crud по умолчанию, тогда вы могли бы использовать collection.

4. «ресурсы» предназначены для выполнения всех или некоторых операций crud, не так ли?

5. @AlexanderSupertramp Пожалуйста, обратитесь guides.rubyonrails.org/routing.html#adding-more-restful-actions . Я обновил ответ, чтобы включить, кто бы вы это сделали. P.S. Речь идет не о понижении, а о том, чтобы понять другой вариант использования метода. 🙂