私はgithubがネストされたURLで持っているようなことをしたいと思います.How do I route user profile URLs to skip the controller? しかし、それをどのように進めるかは本当にわかりません。
たとえば、「:user/:repo/commit/:sha」というコミットを見ると、コントローラーはコミットされています。このタイプのネストされたリソースを複製するにはどうすればよいですか?
ありがとうございました :)
私はgithubがネストされたURLで持っているようなことをしたいと思います.How do I route user profile URLs to skip the controller? しかし、それをどのように進めるかは本当にわかりません。
たとえば、「:user/:repo/commit/:sha」というコミットを見ると、コントローラーはコミットされています。このタイプのネストされたリソースを複製するにはどうすればよいですか?
ありがとうございました :)
どうですか
map.connect ':user/:repo/commit/:sha', :action => :index
または、RESTfulルートが必要な場合はmap.resource
代わりに使用します。map.connect
コントローラでは、URL情報をparamsから取得できます。たとえばparams[:user]
、ユーザー名を返します。
commit が id の代わりに :sha を使用してレコードを検索する RESTful コントローラーである場合。代わりにこれを行うことができます:
map.resource :commits, :path_prefix => ':user/:repo', :as => 'commit'
次のような標準の RESTful ルートを作成します。http://yoursite.tld/:user/:repo/commit/:id
繰り返しますが、URL の id 部分をコミット ID に変換しないのであれば、それを :sha 値として使用できない理由はありません。
例:
class CommitController < ApplicationController
def show
@commit = Commit.find(:first, :conditions => {:sha => params[:id]})
end
...
end
コミット モデルで to_param をオーバーライドして、sha 値を返すこともできます。
class Commt < ActiveRecord::Base
...
def to_param
sha
end
end
これでlink_to commit_url(@commit, :user => current_user, :repo => @repo)
、スキームに一致する URL が提供されます。
ルートに好きな名前を付け、それらを使用するコントローラーとアクションを指定できます。
たとえば、次のようになります。
map.connect ':user/:repo/commit/:sha', :controller => 'transactions', :action => 'commit'
これにより、「transactions」コントローラーの「commit」メソッドにリクエストが送信されます。
その後、パラメータを使用してコントローラで他の変数にアクセスできます。
@user = User.find(params[:user])
@repo = Repo.find(params[:repo])