2014-02-04 3 views
1

Я получил этот вспомогательный метод в моем контроллере приложения:Params и выбор правильных один

def current_team 
    @current_team ||= Team.find(params[:team_id]) 
end 

Проблема заключается в том, что он работает для URL-адресов формата:

/teams/20/members/11 

но это Безразлично» т работы для:

/teams/20 

для того, чтобы заставить его работать на тех, что я должен изменить :team_id быть :id.

Как я могу привести его в порядок, чтобы он «просто работал»?

Спасибо!

ответ

1

Установить переменные экземпляра (@current_team) в контроллерах, никогда в помощниках. Для этого не нужны помощники.

Если вы следуете этому совету, вы, естественно, будете использовать params[:id] в TeamsController, но params[:team_id] в MembersController.

(Некоторые люди даже говорят, что вы не должны использовать помощников вообще. Для облегчения презентации (пользовательские ссылки, кнопки, таблицы и т. Д.) Они предлагают использовать Presenter pattern. Но вам не нужно слушать их :))

0

это не самое лучшее, что можно сделать, но для достижения этой цели вы можете сделать следующее:.

def current_team 
    @current_team ||= Team.find(params[:team_id].presence || params[:id]) 
end 

Документация о Object.presence метода:

http://api.rubyonrails.org/classes/Object.html#method-i-presence


@SergioTulentsev правильно, вы не должны установить переменные экземпляра в помощниках, только в контроллерах.

0

Я предполагаю, что у вас есть другие ресурсы, кроме Team. Rails будет использовать параметр :id для всех ваших ресурсов. Вам нужно будет изучить настройки маршрута для вашего действия teams#show. Легче в Rails 4, чем в Rails 3.

Посмотрите на этот пост для окровавленных деталей: Change the name of the :id parameter in Routing resources for Rails

0

Я бы не сделать params[:team_id] || params[:id], потому что, конечно, в некоторых контекстах контроллера вы получите id параметр который представляет идентификатор для чего-то другого, кроме Team. Предполагая, что /teams/:id маршрут обрабатывается TeamsController, то вы можете сделать следующее (чтобы сохранить ваш метод в ApplicationController и избежать повторения себя в разных контроллерах):

def current_team 
    id = controller_name == "teams" ? params[:id] : params[:team_id] 
    @current_team ||= Team.find(id) 
end 

В качестве альтернативы, вы можете изменить свои маршруты, так что url, чтобы показать Team, является /teams/:team_id и оставьте ваш помощник как есть, но это будет противоречить правилам маршрутизации Rails.

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