私はdeviseとcancanで小さなプロジェクトセットアップをしています。ユーザー、プロジェクト、責任者、およびタスクモデルがあります。プロジェクトにはネストされたタスクがあります。各プロジェクトは1人または複数のユーザーに割り当てられます。タスクモデルには、名前、user_id、およびproject_idがあります。認証と承認は期待どおりに機能しています。user_idをnested_resourceモデルに渡すにはどうすればいいですか?
新しいタスク(名前の入力のみ)を追加すると、project_idが自動的にモデル/テーブルに渡されます(これはルーティングのためだと思いますがuser_idではなく)。
hidden_fieldでuser_idを渡す必要がありますか、それとも何らかの理由でbeforeフィルタでこれを設定することはできますか?
誰かがタスクコントローラのuser_idを設定する方法についてヒントを伝えることができますか?
おかげ
# Routes
resources :projects do
resources :tasks
end
#Models
class User < ActiveRecord::Base
has_many :responsibilities, :dependent => :destroy
has_many :projects, :through => :responsibilities
has_many :tasks, :dependent => :destroy
...
class Project < ActiveRecord::Base
has_many :tasks, :dependent => :destroy
...
class Task < ActiveRecord::Base
belongs_to :project
belongs_to :user
...
# Tasks Controller with all Task.find/new/update/...
# methods removed like explained in cancan manual
class TasksController < ApplicationController
load_and_authorize_resource :project
load_and_authorize_resource :task, :through => :project
...
def create
respond_to do |format|
if @task.save
format.html { redirect_to [@project, @task], notice: 'created.' }
else
format.html { render action: "new" }
end
end
# Task Form View
<%= semantic_form_for [@project, @task] do |f| %>
<%= f.inputs do %>
<%= f.input :name %>
<% end %>
<%= f.actions %>
<% end %>
更新
前のフィルターで動作するようです。これは正しい方法ですか?
class TasksController < ApplicationController
before_filter :set_user, :only => [:create]
load_and_authorize_resource :client
load_and_authorize_resource :task, :through => :client, :shallow => true
...
def set_user()
params[:task][:user_id] = current_user.id.to_s
end
...