Комплексная маршрутизация рельсов - PullRequest
2 голосов
/ 09 января 2010

Я хотел бы сделать что-то похожее на github с вложенными URL-адресами, например Как мне маршрутизировать URL профиля пользователя, чтобы пропустить контроллер? , но я не совсем уверен, как его продолжить.

Например, глядя на коммит, который у них есть: ': user /: repo / commit /: sha', с контроллером, являющимся коммитом. Как бы я повторил этот тип вложенного ресурса?

спасибо:)

Ответы [ 3 ]

1 голос
/ 10 января 2010

Если commit - это контроллер RESTful, который использует: sha вместо id для поиска записей. Вы можете сделать это вместо:

map.resource :commits, :path_prefix => ':user/:repo', :as => 'commit'

Это создаст стандартные маршруты RESTful, которые выглядят как http://yoursite.tld/:user/:repo/commit/:id

Опять же, если вы никогда не будете переводить часть идентификатора в URL в идентификатор фиксации, то нет причин, по которым вы не можете использовать его в качестве значения: sha.

пример:

class CommitController < ApplicationController
  def show
    @commit = Commit.find(:first, :conditions => {:sha => params[:id]})
  end
  ...
end

Вы также можете переопределить to_param в модели фиксации, чтобы вернуть значение ша.

class Commt < ActiveRecord::Base
  ...
  def to_param
    sha
  end
end

Так что теперь link_to commit_url(@commit, :user => current_user, :repo => @repo) предоставит URL, соответствующий вашей схеме.

1 голос
/ 09 января 2010

Как насчет

map.connect ':user/:repo/commit/:sha', :action => :index

Или используйте map.resource вместо map.connect, если вам нужен маршрут RESTful.

В контроллере информацию об URL можно получить из параметров, например, params[:user] возвращает имя пользователя.

0 голосов
/ 10 января 2010

Вы можете назвать свои маршруты по своему вкусу и указать, с какими контроллерами и действиями вы хотели бы их использовать.

Например, у вас может быть:

map.connect ':user/:repo/commit/:sha', :controller => 'transactions', :action => 'commit'

Этопослал бы запрос методу commit в контроллере транзакций.

Затем к вашему контроллеру можно получить доступ к другим переменным с помощью параметров:

@user = User.find(params[:user])
@repo = Repo.find(params[:repo])
...