Попытка дать группам возможность иметь собственный URL в Grails. (Аналогично тому, как вы можете перейти на facebook.com/ndomusername}) - PullRequest
1 голос
/ 22 сентября 2011

Я разрабатываю групповое веб-приложение в Grails (1.3.7), и одним из полей, которые у меня есть, является groupUrl для моего домена группы. Суть в том, что я хочу дать пользователям возможность просматривать http://www.myapp.com/{userDefinedgroupUrl}

Я также хочу иметь возможность иметь www.myapp.com/ndomuserDefinedGroupUrl‹/$action?/$id? Однако, с учетом того, как он реализован сейчас, я должен жестко закодировать все остальные мои контроллеры в сопоставлениях, чтобы они сначала соответствовали и выполнялись должным образом.

Прямо сейчас у меня это работает с чем-то вроде

mappings = { 
    "/group/$action?/$id?"(controller:"group")
    "/user/$action?/$id?"(controller: "user")
    etc..
    "/$groupUrl?/$action?/$id?"(controller: "group")
    "/$groupUrl?/events/$action?/id?"(controller: "groupEvents")
}

Я думаю, что на самом деле это работает прямо сейчас (я еще не проверил это слишком тщательно), но мне было интересно, есть ли лучший, более эффективный способ сделать это.

Любой совет будет оценен.

Спасибо.

1 Ответ

4 голосов
/ 22 сентября 2011

Во-первых, может быть лучше поместить все ваши группы в подпуть, что значительно упрощает управление контроллерами, например:

mappings = { 
    "/$controller/$action?/$id?"()
    "/g/$groupUrl?/$action?/$id?"(controller: "group")
    "/g/$groupUrl?/events/$action?/id?"(controller: "groupEvents")
}

Во-вторых, Grails Отображения URL учитывает динамические контроллеры и действия, поэтому вы можете использовать небольшой код для выбора правильного контроллера, например:

mappings = { 
    "/$controller/$action?/$id?"()
    "/g/$groupUrl/$group_c?/$action?/$id?" {
        controller = {
            (params.group_c in [null, '', 'group']) ?
                'group' :
                'group' + params.group_c.capitalize()
        }

    }
}

Это не идеально, но в основном это допускает следующие URL-адреса:

  • / g / mygroup / -> GroupController.index
  • / g / mygroup / group / view / 45 -> GroupController.view
  • / g / mygroup / event /list / 64 -> GroupEventController.list

Однако он не позволяет отображать действия GroupController без пути /group/.Вы можете обойти это, жестко закодировав список действий в GroupController, и, если group_c находится в этом списке, увеличьте group_c до action и увеличьте action до id.Это было бы некрасиво.

...