ユーザー、プロジェクト、およびタスクを持つシンプルなレールアプリケーションを作成しています。 そして私は次の問題を抱えています:それぞれのユーザーは自分のプロジェクトを持っていなければなりません。それぞれのプロジェクトは自分自身のタスクを持っている必要があります。コンソールからアプリケーションをデバッグしようとすると、プロジェクトやタスクは "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
のように若干の誤差が出る新しいタスクを削除し、対応するコントローラ、また間違って
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
マイグレーションにhas_manyとhas_many_throughリレーションシップを追加する必要がありますか? @lassvi – Mikhah
これはこの問題を解決しましたが、私はまだ私が[ここ](http://stackoverflow.com/questions/36060338/make-unique-object-in-rails)ラッシヴィ – Mikhah