Rails 3 добавляет действие GET к контроллеру RESTful - PullRequest
1 голос
/ 05 августа 2010

У меня есть контроллер с 7 действиями RESTful и дополнительным «текущим» действием, которое возвращает первую активную запись foo:

class FooController < ApplicationController

  def current

    @user = User.find(params[:user_id])
    @foo = @user.foos.where(:active => true).first

    #use the Show View
    respond_to do |format|
      format.html { render :template => '/foos/show' }
    end

  end

  #RESTful actions
  ...

end

Модель Foo: принадлежит_ Модели пользователя и Модель пользователя: has_many Foos.

Если я структурирую маршруты так:

resources :users do
  resources :foos do
    member do
      get :current
    end
  end
end

Полученный маршрут - '/ users /: user_id / foos /: id'. Я не хочу указывать foo: id, очевидно.

Я также пробовал:

map.current_user_foo '/users/:user_id/current_foo', :controller => 'foos', :action => 'current'
resources :users do
  resources :foos
end

Полученный маршрут больше похож на ожидаемый: '/users/:user_id/current_foo'.

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

ActiveRecord::RecordNotFound in FoosController#current
Couldn't find Foo without an ID

1020 * редактировать *

Когда я перемещаю текущее действие в контроллер приложения, все работает как положено. Указанный маршрут должен конфликтовать с маршрутизацией ресурса.

/ редактировать

Чего мне не хватает? Есть ли лучший подход для маршрутизации?

1 Ответ

3 голосов
/ 06 августа 2010

Я думаю, что вы хотите определить текущий для коллекции, а не члена (член - это то, что добавляет: id).

попробуйте это.

resources :users do
  resources :foos do
    collection do 
      get :current
    end
  end
 end

Который должен дать вам такой маршрут:

 current_user_foos GET    /users/:user_id/foos/current(.:format)         {:controller=>"foos", :action=>"current"}

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

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