【问题标题】:How to pass user_id to nested_resource model?如何将 user_id 传递给 nested_resource 模型?
【发布时间】:2012-01-19 20:27:03
【问题描述】:

我有一个带有 devise 和 cancan 的小项目设置。有用户模型、项目模型、责任模型和任务模型。项目有嵌套任务。每个项目都分配给一个或多个用户。任务模型具有名称、user_id 和 project_id。身份验证和授权按预期工作。

添加新任务(仅输入名称)时,project_id 会自动传递给模型/表(我认为这是因为路由),而不是 user_id。

我必须在 hidden_​​field 中传递 user_id 还是可以在前置过滤器中设置它?

有人可以提示一下如何在任务控制器中设置 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
  ...

【问题讨论】:

    标签: ruby-on-rails-3.1 devise cancan formtastic nested-resources


    【解决方案1】:

    如果您使用的是设计,则只需传入您的 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
    

    不知道这是不是你的意思

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      • 2011-08-10
      • 1970-01-01
      • 2015-03-03
      • 1970-01-01
      • 2012-12-07
      • 1970-01-01
      相关资源
      最近更新 更多