Как добавить новое действие в Ruby on Rails? - PullRequest
0 голосов
/ 25 февраля 2010

У меня это в route.rb

map.namespace :admin do |admin|
  admin.resources :projects, :has_many => :products
end

Я хотел бы иметь возможность установить что-то в файле rout.rb, чтобы я мог использовать новое действие в контроллере продуктов. Действия, добавленные вручную после строительных лесов.

Я пробовал что-то вроде этого

 map.namespace :admin do |admin|
   admin.resources :projects, :has_many => :products , :collection => {:plan => :get}
 end

планирую быть моим новым действием в контроллере продуктов

Не сработало, и я нигде не нашел хороших решений. Пожалуйста, помогите.

Ответы [ 3 ]

1 голос
/ 25 февраля 2010

Как уже указывал klew, вы, вероятно, хотите действие члена, а не действие сбора.

Но прежде чем идти по этому пути, подумайте, действительно ли вам это нужно. добавление пользовательских действий не рекомендуется. Вам лучше оставаться в рамках 7 операций CRUD. Способ сделать это - добавить больше контроллеров:)

Например, если у вас есть контроллер users и контроллер groups, то добавление человека в группу не является действием join_group в контроллере users, а не действием add_user в контроллере group, это обычное create действие в memberships контроллере:).

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

Возвращаясь к вашему случаю, я думаю, что вы можете просто добавить одноэлементный ресурс, вложенный в ресурс проекта, как этот

map.namespace :admin do |admin|
    admin.resources :projects, :has_many_products, :has_one => :plan
end

и реализовать: показать действие в plan_controller, которое должно быть сопоставлено с /admin/projects/:project_id/plan

1 голос
/ 25 февраля 2010

Изменение

map.namespace :admin do |admin|
  admin.resources :projects, :has_many => :products
end

в

map.namespace :admin do |admin|
  admin.resources :projects do |project|
    project.resources :products, :member => { :new_action => :get }
  end
end
0 голосов
/ 25 февраля 2010

Здесь у вас есть несколько примеров.

Ваш пример должен генерировать URL, например: /admin/projects/plan. Если вы хотите, чтобы URL был похож на /admin/projects/2/plan, используйте:

map.namespace :admin do |admin|
  admin.resources :projects, :has_many => :products , :member => {:plan => :get}
end

И не забудьте добавить plan метод в ваш admin/products_controller.rb:

def plan
  ...
end

Я не уверен, но, возможно, вам потребуется перезагрузить сервер после изменения маршрутов, чтобы он заработал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...