Как я могу реализовать тщеславные URL в приложении Rails? - PullRequest
9 голосов
/ 26 января 2010

Я хочу, чтобы пользователи могли иметь страницу профиля на site.com/myNameHere. Rails ищет контроллер с именем «myNameHere». Можно ли настроить route.rb так, чтобы, если контроллер не был найден, «myNameHere» отправлялся как параметр другому контроллеру?

Ответы [ 2 ]

9 голосов
/ 26 января 2010

Вы можете добавить маршрут так:

map.profile_link '/:username', :controller => 'profiles', :action => 'show'

Обязательно добавьте его достаточно низко в файл ниже ваших ресурсов, чтобы он не мешал другим маршрутам. Это должно быть самым низким приоритетом. Затем вам нужно изменить действие show, чтобы использовать имя пользователя вместо id:

def show
  @user = User.find_by_username(params[:username])
end

Это все, что нужно сделать. Удачного кодирования!

UPDATE:

Я расширил этот ответ до полного поста в блоге, Vanity URLs в Ruby on Rails Routes . У меня есть дополнительные примеры кода и более подробное объяснение.

0 голосов
/ 02 декабря 2013

Просто подумал, что обновлю это для Rails 3. У меня есть поле 'веб-сайт' в моей пользовательской модели, которое будет действовать как маршрут тщеславия, и я собираюсь направить на статическую страницу для каждого маршрута тщеславия. Я хочу отобразить все пользовательские события, если маршрут тщеславия называется.

#config/routes.rb
  get '/:website', :controller => 'static_pages', :action => 'vanity'

#app/controllers/static_pages_controller.rb
  def vanity
      @user = User.find_by_website(params[:website])
    if @user != nil #in case someone puts in a bogus url I redirect to root
      @events = @user.events
    else
      redirect_to :root
    end
  end

#app/views/static_pages/vanity.html.erb
<h1><%= @user.website  %> events</h1>

<table>
  <tr>
    <th>Title</th>
    <th>Starts at</th>
    <th>Description</th>
    <th></th>
    <th></th>
    <th></th>
  </tr>

<% @events.each do |event| %>
  <tr>
    <td><%= event.title %></td>
    <td><%= event.starts_at %></td>
    <td><%= event.description %></td>
  </tr>
<% end %>
</table>

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

...