2012-01-15 8 views
9

ID /:その直接(/ポスト)またはネストされたルート(/ユーザー/を介してアクセスする場合、私はポストのコントローラ内知ることができる方法レールコントローラ

resources :users do 
    resources :posts 
end 

resources:posts 

:と投稿/

routes.rbを、このようなものです投稿)?

例えば、ポストコントローラのインデックスメソッドがどうあるべきかについて/ユーザー/正しいINDEXアクション実行のため:ID /投稿をしてために/ポスト

は、これを行うための良い方法はありますか?

答えて

7

一つの解決策は次のように、あなたのコントローラ上のフィルタの前に使用することができます。

indexアクションに必要ありませんリファクタリングは、@postsはすでに正しくロードされていますが、

def index 
    @posts = @posts.where('updated_at < ?' Time.now) 
end 

を好きなようにあなたは、さらにフィルタリングを行うことができますそして、すべてのメンバーのアクション更新:、新しいを作成し、ショー、編集、更新、破壊し、次のような投稿をベースとして使用してください:

def new 
    @post = @posts.build 
end 

def create 
    @post = @posts.build(params[:task]) 
end 

def show 
    @post = @posts.find(params[:id]) 
end 

def edit 
    @post = @posts.find(params[:id]) 
end 

def update 
    @post = @posts.find(params[:id]) 
end 

def destroy 
    @post = @posts.find(params[:id]) 
end 

もちろん、重複するコードを削除する前に他のフィルタを追加することができます。

1

paramsを確認します。

だけで投稿する場合、ユーザ/ポストあなたはポストのユーザーとIDを持っているだろう場合、あなただけの:id

を持っています。

そうparams[:user] ...

n.b.かどうかを確認ユーザーでない場合は、params[:user_id]

indexについてはpostsの方法はどちらの場合も実際に同じになると思います。何が変わるかは、ユーザーの使用方法、関連付け、スコープです。そして、あなたが適切に機能するためにあなたのコントローラビットを書き換える必要があり

before_filter :load_user 

def load_user 
    @user = User.find(params[:user_id]) if params[:user_id] 
    @posts = @user ? @user.posts : Post.scoped 
end 

関連する問題