2016-07-10 12 views
0

ruby​​ on railsを使用したタスク管理のためのWebアプリケーションを開発しています。 私はusertaskの2つのモデルを持っています。モデルは次のようになりますアソシエーションin Rails 4

タスクが作成されたときにユーザーにタスクを割り当てることです。しかし、私はcreateのアクションでそれを行う方法がわからないtasks_controller。私のアクションを作成して、作成したときに管理者がタスクを割り当てするたびに、この

def create 
    @task = Task.new(task_params) 
    respond_to do |format| 
     if @task.save 
     @user = User.assigned_user(task_params) 
     @user.tasks << Task.last 
     format.html { redirect_to @task, notice: 'Task was successfully created.' } 
     format.json { render :show, status: :created, location: @task } 
     else 
     format.html { render :new } 
     format.json { render json: @task.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

のように見える、それはundefined method tasks for #<User::ActiveRecord_Relation:0x007fe7b1c60610>を言ってエラーが発生します。誰もがこの問題で何ができるのかを助けることができますか?

+0

この商品は? '@user = User.assigned_user(task_params)'また、次の行でこれを使用します: '@user.tasks << @ task'、データベースで不必要にクエリを実行するotherwhise。 – developer033

+0

assigned_userは、ユーザーモデルのメソッドで、データベースから取得したユーザーを返します。 –

答えて

0

where方法は、ユーザーのコレクションを返すので、あなたがあるとあなただけの一人のユーザーが欲しい与えているエラー:

def self.assigned_user(task_params) 
    User.where("name = ?", task_params["assigned_to"]).first 
end 
あなたはおそらく、私はあなたがあれば問題を抱えている可能性が推測ようにコードを修正したい

nameは一意ではありません。ユーザーの取得に使用するフィールドが一意であることを確認します。

作成するためのコードは次のように見ることができますが:

def create 
    @task = Task.new(task_params) 
    respond_to do |format| 
    if @task.save 
     @user = User.assigned_user(task_params) 
     @user.tasks << @task 
     format.html { redirect_to @task, notice: 'Task was successfully created.' } 
     format.json { render :show, status: :created, location: @task } 
    else 
     format.html { render :new } 
     format.json { render json: @task.errors, status: :unprocessable_entity } 
    end 
    end 
end 
+0

@userはまだ割り当てられていません。これは、エラー 'Nilクラスのための未定義メソッドタスク'を提供します。 –

+0

私は答えを編集していました。再度お試しください。 – chipairon

0

まあエラー、自身のために語っています:ユーザー:: ActiveRecord_Relationため

未定義のメソッドタスク:0x007fe7b1c60610>

def self.assigned_user(task_params) 
    User.where("name = ?", task_params["assigned_to"]) 
end 

where方法はarrayActiveRecord_Relation)を返しますが、一つのオブジェクトを取得するためにだけ必要があるため、そして、それがあることshoud:

User.where(name: task_params["assigned_to"]).first 

またはより良い:

User.find_by(name: task_params["assigned_to"]) 

また、この行:

@user.tasks << Task.last 

データベース内のクエリを不必要に実行します。

だから、それは次のように変更します。

@user.tasks << @task 

はそれが役に立てば幸い!

関連する問題