2013-04-10 3 views
3

Любой, кто уже реализовал что-то подобное с помощью Grails, мог бы мне сказать, какие хорошие оценки (если они есть) для создания URL-адресов профилей в формате «http://www.myservice.com/username», так как в Facebook, Twitter, Linkedin?Создайте «красивые» URL-адреса профиля в приложении Grails

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

Итак, любые предложения приветствуются, спасибо.

UPDATE 1

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

"/$controller/$action?/$id?"() 

РЕШЕНИЕ

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

Как указывалось, для выполнения такого сопоставления мне нужно более точно контролировать, как обрабатываются мои запросы. Это означает, что мне нужно будет рассказать Grails, какие контроллеры я не хочу сопоставлять с правилом «имя пользователя».

Так что будет очень утомительной задачей (потому что у меня есть несколько контроллеров), я сделал это, чтобы автоматизировать:

UrlMappings.groovy

static mappings = { 
    getGrailsApplication().controllerClasses.each{ controllerClass -> 
    "/${controllerClass.logicalPropertyName}/$action?/$id?"(controller: controllerClass.logicalPropertyName) 
    } 
    "/$username/$action?"(controller: "user", action: "profile") 
    } 
    ... 
} 

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

Все, спасибо всем.

+0

[этот учебник] (http://www.ibm.com/developerworks/library/j-grails03109/) делает что-то очень похожее, я думаю, вы можете получить от него некоторые направления. (Раздел 'Отображение записей по автору ') – moeTi

+0

Спасибо, но это не совсем то, что мне нужно. Этот учебник посвящен проблеме сопоставления, но избегает множественных возможных совпадений с URL-адресом, предварительно назначая его «/ blog /». – Uilian

ответ

4

Предполагая, что у вас есть UserController, и вы собираетесь сопоставить любое имя domain.com/username с действием show user-контроллера, ваше сопоставление url может быть примерно таким: В моем примере имя станет параметром в вашем Титулы. для получения дополнительной информации см. here

Надеюсь, что это поможет.

static mappings = { 
    "/$name"(controller: "user", action: "show") 

    ... 
} 
+0

Спасибо! Ваши предположения все правильные, это именно то, что я делаю. Но это вызывает некоторые нежелательные побочные эффекты. Самое неприятное, что перед применением этого сопоставления я мог бы получить действие по умолчанию контроллера только с помощью http://example.com/controllername. Вот почему я спрашиваю, есть ли лучший способ, или если это единственный метод, и я должен иметь дело с ним. – Uilian

+0

Если я правильно вас понимаю, вы не хотите использовать какое-либо имя контроллера в своем URL-адресе. если это так: «/ $ name» (контроллер: «пользователь», действие: «показать») не нуждается в URL-адресе, он будет маршрутизировать www.domain.com/Uilian на пользовательский контроллер любое действие, которое назначено для обработки вашего request, в моем примере «show» – Alidad

+0

Вы правы @alidad, я хочу показать профиль пользователя, используя это сопоставление, предложенное вами, но у меня есть другие объекты в моем приложении, к которым я хотел бы получить доступ, используя сопоставление по умолчанию. Я буду обновлять свой вопрос с помощью этой информации, спасибо. – Uilian

1

Учитывая ваши требования, все после http://yourdomain.com/ может быть имя пользователя или один из ваших других контроллеров, которые могут иметь нежелательные эффекты, в зависимости от которых отображение URL определяется первым (например контроллер пользователя против контроллера NONUSER). Но, скорее всего, список контроллеров nonuser будет меньшим списком, поэтому вы должны перенести его первым и фильтровать против него, а затем обработать все другие сопоставления url как сопоставления пользователей.

Вот пример:

static mapping = { 
    "/$controller/$action?/$id?" { 
    constraints { 
     controller inList: ['nonUserController1', 'nonUserController2',...] 
    } 
    } 

    //this should work for /username and /username/whateveraction 
    "/$username/$action?"(controller: 'user') 
} 

Некоторые вещи, чтобы отметить здесь:

  • вам нужно поместить не пользовательское отображение контроллера URL-адрес первым, так как все остальное после http://yourdomain.com/ может быть именем пользователя - верный?
  • вторых вам необходимо поместить ограничение, чтобы поймать всех не контроллеры пользователей, в то время как игнорировать пользователь URL-адрес отображение
  • также нужно, чтобы запретить пользователь подписавшись с именем пользователя, который соответствует одному из ваших, не являющихся контроллеров пользователя
+0

Да, я думаю, ты прав. Я просто не уверен, что по правилам приоритетов UrlMappings второй (нацеленный на совпадение имен пользователей) не заканчивается первым, который будет оцениваться, поскольку он имеет меньше подстановочных знаков. Но мне очень понравился этот подход, его гораздо чище, чем то, что я делал, спасибо! – Uilian

+0

Хорошо, я протестировал ваше решение, и, как я подозревал, все запросы сопоставляются с «/ username/$ action?» Из-за правил приоритета. Но ваше предложение действительно было очень полезно, и я придумал решение, я обновлю свой вопрос. Спасибо! – Uilian

+0

можете ли вы разместить свой код? – ikumen