2016-04-02 5 views
0

ユーザー、プロジェクト、およびタスクを持つシンプルなレールアプリケーションを作成しています。 そして私は次の問題を抱えています:それぞれのユーザーは自分のプロジェクトを持っていなければなりません。それぞれのプロジェクトは自分自身のタスクを持っている必要があります。コンソールからアプリケーションをデバッグしようとすると、プロジェクトやタスクは "user_id" "project_id"。私のDBが正しく構成されていなかったため、アプリケーションが正常に動作しなかったため(プロジェクトやタスクテーブルに列が追加されず、単にアプリケーションを作成できないため、 1つのプロジェクトにしか属していないタスク(それはアプリケーションの要点です) 私のモデルやマイグレーションを扱う人が助けてもらえますか?移行テーブルの列をレールに正しく追加する4

Project.rb

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

User.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+\-.][email protected][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 

Task.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 

今/私はいつもここにもenter image description here

のように若干の誤差が出る新しいタスクを削除し、対応するコントローラ、また間違って

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 

答えて

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 
+0

マイグレーションにhas_manyとhas_many_throughリレーションシップを追加する必要がありますか? @lassvi – Mikhah

+0

これはこの問題を解決しましたが、私はまだ私が[ここ](http://stackoverflow.com/questions/36060338/make-unique-object-in-rails)ラッシヴィ – Mikhah

関連する問題