如何在控制器上添加外键值在部分

时间:2015-07-18 08:33:43

标签: ruby-on-rails

我问了一个类似的question,但回答涉及使用current_user。这个问题有点不同。 我有一个简单的数据库,用户可以在其中创建类别。每个类别都有很多任务。我希望用户单击某个类别以查看该类别的任务。用户和类别之间的关系是1到多,类别和任务之间的关系也是一对多。

我遇到的问题是在任务中创建外键,以便它可以告诉它属于哪个类别。当用户单击类别

时,就会发生任务创建

我的模型如下

category.rb

class Category < ActiveRecord::Base
    has_many :tasks
    belongs_to :users
end

task.rb

class Task < ActiveRecord::Base
    belongs_to :categories
end

控制器

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

我认为问题是我用于task_params的问题。目前我没有办法解决这个问题。如何在用户创建任务时将类别外键插入任务?

1 个答案:

答案 0 :(得分:0)

首先将您的belongs_to关联更改为 单数

belongs_to :user #in category.rb
belongs_to :category #in task.rb

然后在create方法中,为category定义 实例变量 ,如下所示

@category = Category.find(params[:category_id])并更改您的create方法,如下所示

def create
  @category = Category.find(params[:category_id])
  @task = Task.new(task_params)
  @task.category_id = @category.id
  respond_to do |format|
    if @task.save
      format.html { redirect_to @task, notice: 'Task was successfully created.' }
      format.json { render :show, status: :created, location: @task }
      render :layout => false
    else
      format.html { render :new }
      format.json { render json: @task.errors, status: :unprocessable_entity }
      render :layout => false
    end
  end
end

并确保:category_id方法中有task_params

<强> 更新

您还应该在控制器中定义task_params方法,如下所示。

def task_params
  params.require(:task).permit(:id, :blobby, :challenge_id, :category_id)
end