【问题标题】:Add table columns correctly in rails 4在 rails 4 中正确添加表格列
【发布时间】:2016-04-02 14:14:38
【问题描述】:

我正在编写一个包含用户、项目和任务的简单 Rails 应用程序。 我还有下一个问题:每个用户都必须有自己的项目,每个项目都必须有自己的任务。当我尝试通过控制台调试我的应用程序时,我可以看到项目和任务是在没有“user_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 User < ActiveRecord::Base
  has_many :tasks, through: :projects, dependent: :destroy
  has_many :projects, dependent: :destroy
  attr_accessor :remember_token
  before_save { self.email = email.downcase }
  validates :name,  presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensitive: false }
  has_secure_password
  validates :password, presence: true, length: { minimum: 6 }, allow_nil: true

  # Returns the hash digest of the given string.
  def User.digest(string)
    cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
                                                  BCrypt::Engine.cost
    BCrypt::Password.create(string, cost: cost)
  end

  # Returns a random token.
  def User.new_token
    SecureRandom.urlsafe_base64
  end

  # Remembers a user in the database for use in persistent sessions.
  def remember
    self.remember_token = User.new_token
    update_attribute(:remember_digest, User.digest(remember_token))
  end

  # Returns true if the given token matches the digest.
  def authenticated?(remember_token)
    return false if remember_digest.nil?
    BCrypt::Password.new(remember_digest).is_password?(remember_token)
  end

  # Forgets a user
  def forget
    update_attribute(:remember_digest, nil)
  end
end

任务.rb

class Task < ActiveRecord::Base
  belongs_to :project
end

用于创建项目的迁移

class CreateProjects < ActiveRecord::Migration
  def change
    create_table :projects do |t|
      t.string :name

      t.timestamps null: false
    end
  end
end

用于创建任务

class CreateTasks < ActiveRecord::Migration
  def change
    create_table :tasks do |t|
      t.string :name
      t.datetime :deadline

      t.timestamps null: false
    end
  end
end

现在,当我尝试创建/更新/删除新任务时,我总是会收到一些错误,例如

这里还有对应的控制器,可能那里也有问题

projects_controller.rb

class ProjectsController < ApplicationController
  before_action :find_project!, only: [ :update, :destroy]

  # GET /projects
  # GET /projects.json
  def index
    @projects = current_user.projects
    @project  = Project.new
  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 = current_user.projects.create(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 find_project!
      @project = current_user.projects.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_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 = @project.tasks.create(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
    current_user.tasks.where(id: params[:task][:task_ids])
    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 task_params
      params.require(:task).permit(:name, :position)
    end

  def find_task!
    @task = current_user.tasks.find(params[:id])
  end

  def find_project!
    @project = current_user.projects.find(params[:task][:project_id])
  end
end

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    在迁移中也添加属于。

    class CreateProjects < ActiveRecord::Migration
      def change
        create_table :projects do |t|
          t.string :name
    
          t.belongs_to :user
    
          t.timestamps null: false
        end
      end
    end
    
    class CreateTasks < ActiveRecord::Migration
      def change
        create_table :tasks do |t|
          t.string :name
          t.datetime :deadline
    
          t.belongs_to :project
    
          t.timestamps null: false
        end
      end
    end
    

    【讨论】:

    • 我还应该在迁移中添加 has_many 和 has_many_through 关系吗? @lassvi
    • 嗯,解决了这个问题,但我仍然有我提到的问题here,无论如何@lassvi
    猜你喜欢
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    相关资源
    最近更新 更多