How to pass user_id to nested_resource model? #550

Closed
tonymarschall opened this Issue Jan 19, 2012 · 2 comments

Projects

None yet

1 participant

@tonymarschall

I have a small project setup with devise and cancan. There are User, Project, Responsible and Task Models. Project has nested Tasks. Each Project is assigned to one or multiple users. The task model has a name, user_id and project_id. Authentication and Authorization is working like expected.

When adding a new Task (only an input for name) the project_id gets automatically passed to model/table (i think this is because of routing) but not the user_id.

Do i have to pass the user_id in a hidden_field or is it somehow possible to set this in a before filter?

Can somebody give a hint on howto set user_id in taskcontroller?

Thanks

# 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 %>
@tonymarschall

It seems to work with a before filter. Is this the right way?

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
  ...
@tonymarschall

And another possibility

     @task.user = current_user
    respond_to do |format|
      if @task.save
        format.html { redirect_to [@project, @task], notice: 'created.' }
      else
        format.html { render action: "new" }
      end
  end

thanks to http://stackoverflow.com/questions/8932783/how-to-pass-user-id-to-nested-resource-model/8934454#8934454

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment