Сопоставление двух моделей для использования example.com/<name> - PullRequest
0 голосов
/ 01 января 2011

В моем приложении есть модель user и модель project.Я хочу, чтобы оба из них имели свои действия show/edit на http://example.com/<username or project name> и http://example.com/<username or project name>/edit

Если бы это была только одна модель, я мог бы добавить условие match '/:username' с низким приоритетом в мои маршруты.Как бы я поступил так с несколькими моделями?

1 Ответ

1 голос
/ 01 января 2011

Это, вероятно, плохая идея - я бы не советовал вам это делать. Вероятно, есть лучший способ удовлетворить ваши потребности - что не так с example.com/users/123/

Однако, если вы должны это сделать, вы, вероятно, могли бы создать третий контроллер, который я назову ярлыком контроллера.

Сначала вам нужно направить на контроллер ярлыков, чтобы переменная :/name передавалась ему для показа и редактирования. Посмотрите идеи для маршрутизации в этом Railscast .

Тогда в действиях контроллера ярлыков вам потребуется порядок приоритетов (в случае, если пользователь и проект имеют одно и то же имя), где вы сначала проверяете имя пользователя, совпадающее с данным именем, и отображаете / редактируете тот или иной вид. для проекта, а затем показать ошибку 404.

Это будет выглядеть примерно так:

def show
  if @user = User.find_by_name(params[:name])
    render 'users/show'
  elsif @project = Project.find_by_name(params[:name])
    render 'projects/show'
  else
    raise ActiveRecord::RecordNotFound, "Error message"
  end
end

В любом случае, это, вероятно, можно заставить работать, но, опять же, я не уверен, что это хорошая идея, и я подозреваю, что в этой идее вам придется много работать. Удачи!

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