2010-08-05 3 views
1

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

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 Модель: belongs_to Пользователя Модель и модель пользователя: has_many Foos.

Если я структурировать маршруты, такие как:

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

Полученный маршрут '/ пользователей /: идентификатор_пользователя/Foos /: идентификатор'. Очевидно, я не хочу указывать foo: id.

Я также попытался:

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

Полученный маршрут больше, как я бы ожидать:/пользователей /: user_id/current_foo '.

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

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

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

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

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

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

ответ

3

Я думаю, что вы хотите определить текущий в коллекции, а не член (членом является то, что добавляет: 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"} 

карты также не используется больше в РЦ, это даст вам предупреждение устаревания.

+0

Немного неинтуитивно, но это сработало - спасибо. Любые мысли о том, как обрабатывать случай, если соответствующий foo не найден? Я, вероятно, хочу показать страницу, в которой говорится, что «у этого человека нет foo», вместо того, чтобы возвращаться на последнюю страницу и показывать флеш-сообщение. – craig

+0

hmm, трудно сказать, как пользователь может выбрать текущий foo ?. Вы смотрите на пользователя, а затем нажмите кнопку/следуете ссылке, чтобы найти текущие foo, назначенные этому пользователю? Если это так, я бы подумал, возвращаясь на запрашивающую страницу, с уведомлением о том, что никаких фосов не было бы в порядке. – Doon

Смежные вопросы