I have Users
that have many People
that have many Projects
.
たとえば、新しいプロジェクトは次のように作成できます。
def new
@project = Project.new(:person_id => params[:person_id])
@title = "New project"
end
person_id
ユーザーが実際に自分に属するものだけを挿入できるようにするにはどうすればよいですか?
I have Users
that have many People
that have many Projects
.
たとえば、新しいプロジェクトは次のように作成できます。
def new
@project = Project.new(:person_id => params[:person_id])
@title = "New project"
end
person_id
ユーザーが実際に自分に属するものだけを挿入できるようにするにはどうすればよいですか?
セッション (サーバー側) から user_id を取得しますが、パラメーター (クライアント側) は取得しません。
def new
@project = Project.new(:person_id => session[:current_user_id])
end
または、インターフェイスをより制限します。
def new
@project = Project.create_for_current_user(session)
end
def Project.create_for_current_user(session)
return Project.new(:person_id => session[:current_user_id])
end
これには暗黙の承認を使用することを検討してください。最終結果は次のようになります。
# GET people/1/projects/new
def new
user = User.find(session[:current_user_id])
@project = user.people.find(params[:person_id]).projects.build(:title => "New Project")
end
# POST people/1/projects
def create
user = User.find(session[:current_user_id])
user.people.find(params[:person_id]).projects.create(params[...])
end
次に、routes.rbで:
resources :people do
resources :projects
end
このアプローチでは、新しいプロジェクトは自動的にユーザーに帰属します。
ちなみに、Devise や before_filter などの使用を検討する必要があります。これUser.find
により、各アクションで行う必要がなく、より便利に現在のユーザーにアクセスできるようになります。
さらに、コントローラー アクションに @title 変数を追加しないでください。各コントローラ アクションは、リソースまたはリソースのコレクションを共有する必要があります。