2010-01-09 4 views
2

Я хотел бы сделать что-то вроде github с вложенными URL-адресами и как How do I route user profile URLs to skip the controller?, но не совсем уверен, как это сделать.Комплекс Rails Маршрутизация

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

спасибо :)

+0

В чем проблема, с которой вы сталкиваетесь? Что вы пробовали и что не сработали? Если вы хотите использовать тот же маршрут, что и github, используйте только тот же маршрут. – Eilon

+0

Я хотел иметь возможность иметь вложенные ресурсы внутри этого, и понял, что могу сделать это с помощью map.with_options: path_prefix => '/: user' do .... – 2010-01-10 03:50:23

ответ

1

Если совершить это RESTful контроллер, который использует: ша вместо идентификатора для поиска записей. Вы можете сделать это вместо того, чтобы:

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

Как насчет

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

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

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

0

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

Например, вы могли бы:

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

Это направит запрос к методу «фиксации» в контроллере «Транзакции».

Другие переменные могут быть доступны в вашем контроллере с использованием Params:

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

 Смежные вопросы

  • Нет связанных вопросов^_^