在rails中创建唯一对象

所以我通过编写一些简单的应用程序来学习rails。在那个应用程序中我有两种类型的对象:Tasks和Projects.Sense是所有这些对象都可以由用户创建,用户必须能够操纵它们等等。每个任务belongs_to项目和项目has_many任务。但是当我创建新项目时 – 它已经拥有来自所有其他项目的所有任务,所以它看起来像: 当前项目视图

这个’123’任务是通过简单地将任务添加到’Project’创建的,但同样的任务仍然出现在’Another project’中。如何解决这个bug并使我的任务独一无二?我认为必须在任务或项目模型中添加一些东西但是我不知道应该添加什么。

以下是相应的型号和控制器:

Task.rb

 class Task < ActiveRecord::Base belongs_to :project end 

Project.rb

 class Project < ActiveRecord::Base belongs_to :user has_many :tasks, dependent: :destroy validates :name, presence: true, uniqueness: true end 

tasks_controller.rb

 class TasksController < ApplicationController before_action :set_task, only: [:show, :edit, :update, :destroy] # GET /tasks # GET /tasks.json def index @tasks = Task.all end # GET /tasks/1 # GET /tasks/1.json def show end # GET /tasks/new def new @task = Task.new end # GET /tasks/1/edit def edit end # POST /tasks # POST /tasks.json def create @task = Task.new(task_params) respond_to do |format| if @task.save format.html { redirect_to home_url } format.json { render :show, status: :created, location: @task } else format.html { render :home_url } format.json { render json: @task.errors, status: :unprocessable_entity } end end end # PATCH/PUT /tasks/1 # PATCH/PUT /tasks/1.json def update respond_to do |format| if @task.update(task_params) format.html { redirect_to home_url } format.json { render :home_url, status: :ok, location: @task } else format.html { render :home_url } format.json { render json: @task.errors, status: :unprocessable_entity } end end end # DELETE /tasks/1 # DELETE /tasks/1.json def destroy @task.destroy respond_to do |format| format.html { redirect_to home_url } format.json { head :no_content } end end private # Use callbacks to share common setup or constraints between actions. def set_task @task = Task.find(params[:id]) end # Never trust parameters from the scary internet, only allow the white list through. def task_params params.require(:task).permit(:deadline, :name) end end 

projects_controller.rb

 class ProjectsController < ApplicationController before_action :set_project, only: [:show, :edit, :update, :destroy] # GET /projects # GET /projects.json def index @projects = Project.all end # GET /projects/1 # GET /projects/1.json def show end # GET /projects/new def new @project = Project.new end # GET /projects/1/edit def edit end # POST /projects # POST /projects.json def create @project = Project.new(project_params) respond_to do |format| if @project.save format.html { redirect_to home_url } format.json { render :show, status: :created, location: @project } else format.html { render :home_url } format.json { render json: @project.errors, status: :unprocessable_entity } end end end # PATCH/PUT /projects/1 # PATCH/PUT /projects/1.json def update respond_to do |format| if @project.update(project_params) format.html { redirect_to home_url } format.json { render :show, status: :ok, location: @project } else format.html { render :home_url } format.json { render json: @project.errors, status: :unprocessable_entity } end end end # DELETE /projects/1 # DELETE /projects/1.json def destroy @project.destroy respond_to do |format| format.html { redirect_to home_url } format.json { head :no_content } end end private # Use callbacks to share common setup or constraints between actions. def set_project @project = Project.find(params[:id]) end # Never trust parameters from the scary internet, only allow the white list through. def project_params params.require(:project).permit(:name) end end 

任务视图 –

  

要在创建任务时设置project_id,请在表单中添加以下内容:

 <%= f.select :project_id, options_for_select(Project.choices) %> 

然后在project.rb

 def self.choices all_projects = [] Project.find_each do |project| # show the name but save the id all_projects << [project.name, project.id] end all_projects end 

然后使用Task.where(project_id: project_id)而不是Task.all更改显示任务,如前两个注释所示。