2016-04-02 8 views
0

Ich schreibe eine einfache Rails App, die Benutzer, Projekte und Aufgaben hat. Und ich habe das nächste Problem: Jeder Benutzer muss seine eigenen Projekte haben, und jedes Projekt muss seine eigenen Aufgaben haben. Wenn ich versuche, meine App über die Konsole zu debuggen, kann ich sehen, dass Projekte und Aufgaben ohne "user_id" und erstellt werden "project_id" .So wurde meine DB falsch konfiguriert und wegen App funktioniert nicht richtig (Spalten wurden nicht zu den Projekten und Aufgaben Tabellen hinzugefügt und deshalb kann die App einfach keine Projekte erstellen, die nur zu einem Benutzer gehören und Aufgaben, die nur zu einem Projekt gehören (und das ist der Hauptpunkt der App) Kann mir jemand helfen, mit meinen Modellen und Migrationen umzugehen, denn ich bin wirklich mit diesem Zeug festgefahrenHinzufügen von Tabellenspalten korrekt in Schienen 4

Hier sind die entsprechenden Modelle und Migrationen

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

Migration für die Erstellung von Projekten

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

     t.timestamps null: false 
    end 
    end 
end 

Und für die Erstellung von Aufgaben

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

     t.timestamps null: false 
    end 
    end 
end 

Jetzt, wenn ich versuche/erstellen Sie Update/eine neue Aufgabe löschen habe ich immer einige Fehler wie enter image description here

Auch hier sind die entsprechenden Controller, vielleicht auch etwas falsch gibt

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 

Antwort

1

Fügen Sie auch die Zugehörigkeit zu den Migrationen hinzu.

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

Sollte ich auch has_many und has_many_through Relationen zu Migrationen hinzufügen? @lassvi – Mikhah

+0

Nun, das hat dieses Problem gelöst, aber ich habe immer noch das Problem, das ich [hier] (http://stackoverflow.com/questions/36060338/make-unique-object-in-rails) erwähnt habe, ty sowieso @ Lassvi – Mikhah