【问题标题】:Create object with correct ID in Rails 4在 Rails 4 中创建具有正确 ID 的对象
【发布时间】:2016-04-03 00:59:18
【问题描述】:

所以我通过编写一些简单的应用程序来学习 rails,在那个应用程序中我有两种类型的对象:任务和项目。感觉所有这些对象都可以由用户创建,用户必须能够操作它们等等on.Each 任务属于_to 项目和项目 has_many 任务。但是当我创建新项目时 - 它已经拥有来自所有其他项目的所有任务,所以它看起来像:

这个“123”任务是通过简单地将任务添加到“项目”而创建的,但相同的任务仍然出现在“另一个项目”中。我怎样才能修复这个错误并使我的任务独一无二?我认为必须向任务添加一些东西或项目模型,但我不知道应该添加什么。

下面是对应的控制器: 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, :project_id)
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

以及对应的视图: 任务

<% @tasks.each do |task| %>
  <div  class="row task">
    <div class="col-xs-12">
      <div class="col-xs-1 checkbox">
         <%= check_box_tag 'accept' %>
      </div>
      <div class="col-xs-8 taskbody">
        <%= task.name %>
      </div>
    <div class="mini-glyph">
      <div class="col-xs-1">
        <span class="glyphicon glyphicon-arrow-up"></span>
        <span class="glyphicon glyphicon-arrow-down"></span>
      </div>
      <div class="col-xs-1">
        <%= link_to edit_task_path(task) do %>
          <span class="glyphicon glyphicon-pencil"></span>
        <% end %>
      </div>
      <div class="col-xs-1">
        <span><%= link_to " ", task, method: :delete, data: { confirm: 'Are you sure?' }, class:"glyphicon glyphicon-trash" %></span>
      </div>
    </div>
  </div>
</div>
<% end %>

对于项目:

<div class="container">
  <% @projects.each do |project| %>
  <div  class="projectblock">
    <div class="row project-bar">
      <div class="col-xs-12 ">
        <div class="col-xs-1">
          <span class="glyphicon glyphicon-list-alt"></span>
        </div>
        <div  class="col-xs-9 prname">
          <%= project.name %></td>
        </div>
        <div class="col-xs-1">
          <%= link_to edit_project_path(project) do %>
            <span class="glyphicon glyphicon-pencil"></span>
          <% end %>
        </div>
        <div class="col-xs-1">
          <span><%= link_to " ", project, method: :delete, data: { confirm: 'Are you sure?' }, class:"glyphicon glyphicon-trash" %></span>
        </div>
      </div>
    </div>
      <div class="row add-task-bar">
        <div class="input-bar col-xs-12 ">
        <div class="glyphicon glyphicon-plus col-xs-1 left_plus" ></div>
        <div class="col-xs-10" >
          <div class="input-group">
            <input type="text" class="form-control" placeholder="Start typing here to create a task...">
            <span class="input-group-btn">
                <button class="btn btn-default" type="button"><%= link_to 'Add task', new_task_path %></button>
            </span>
          </div>
        </div>
      </div>
    </div>
    <div class="col-xs-8 taskbody">
<% project.tasks.each do |task| %>
  <%= @task.name %>
<% end %>
</div>
</div>
    <% end %>
</div>
  <div class="row text-center">
    <div class="col-xs-4"></div>
      <div class="todo-btn col-xs-4">
        <a href="projects/new" class="btn">
            <span class="glyphicon glyphicon-plus"></span>
            Add TODO list
      </a>
    </div>
</div>

我知道我是第二次问这个问题,但由于我的错误,最后一个问题没有得到完全回答——我根本不明白应该在哪里插入“Task.where(project_id: project_id) " 所以我不得不再次征求意见

项目.rb

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

任务.rb

class Task < ActiveRecord::Base
  belongs_to :project
end

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    您的问题似乎在这里:

    <%= render :template => 'tasks/index' %>
    

    你没有显示你的代码,但基本上你正在渲染你的所有任务,我认为索引只是调用所有任务。

    你想要做的是用类似的东西替换它:

    <% project.tasks.each do |task| %>
      <%= task.name %> <%= task.whatever_else_xx %>
    <% end %>
    

    我没有将它们放入格式,但您可以根据需要包装 html,并且我没有使用您可能想要做的部分,并且我假设项目是您的项目对象填充为,它包含 has_many :tasks,但你应该明白了。

    您实际上不需要在 Tasks.where 中执行,rails active record 会为您处理它,但是我注意到这行可能有点问题:

    params.require(:task).permit(:deadline, :name)
    

    当你创建一个任务时,它需要设置你的数据库应该有的 project_id 列,如果你使用了迁移 - 这会为给定的任务设置父项目。

    params.require(:task).permit(:deadline, :name, :project_id)
    

    并且您需要确保在表单中将其作为隐藏字段发送。您可以手动检查上述代码是否正常工作,方法是将您需要的 project_id 手动添加到任务行,但对于新的应发送 id 的任务。

    【讨论】:

    • 更多寻找类 Project
    • 我已经添加了我的模型,但是(对不起,如果我很烦人)你的意思是我可以通过更改相应的视图来保留所有这些“位置”并保持控制器不变吗?
    • 再次为那个破碎的评论道歉
    • 别担心!您可能想要进行一些清理,但我提供的 sn-p 应该只需在视图中替换即可。让我知道,如果没有,请发表评论!
    • TY,我会在几分钟内尝试,一定会通知您)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多