Как передать user_id в модель nested_resource? - PullRequest
1 голос
/ 20 января 2012

У меня есть небольшая настройка проекта с devise и cancan.Существуют пользовательские, проектные, ответственные и целевые модели.Проект имеет вложенные задачи.Каждый проект назначается одному или нескольким пользователям.Модель задачи имеет имя, user_id и project_id.Аутентификация и Авторизация работает как ожидалось.

При добавлении новой Задачи (только вход для имени) идентификатор_проекта автоматически передается в модель / таблицу (я думаю, что это из-за маршрутизации), но не в идентификатор пользователя.

Должен ли я передавать user_id в скрытое поле или можно как-то установить его в фильтре before?

Может кто-нибудь дать подсказку, как установить user_id в taskcontroller?

Спасибо

# 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
  ...

1 Ответ

0 голосов
/ 20 января 2012

если вы используете devise, вы можете просто передать действие create user_id

  def create
     @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

не тихо уверен, если это то, что вы имеете в виду

...