-1

Ich möchte das, wenn der Benutzer ein Projekt erstellt, er könnte auch neue Aufgaben hinzufügen. Ich habe diese "Lösung" herausgefunden und diesen Fehler, den ich nicht lösen kann, umgangen.Parameter fehlt oder der Wert ist leer: Aufgabe. Wie kann ich ein "To Do" hinzufügen und gleichzeitig die Ansicht zum Erstellen eines Projekts rendern?

Ich weiß nicht einmal davon ist "Ruby Korrekt", dass ich Aufgaben Aktionen mit dem Projektcontroller mischen. Der Grund, warum ich diesen Ansatz nahm, dass ich nicht in den Ansichten zu tun, um eine Lösung herausfinden konnte, und das Projekt gespeichert werden machen ..

Das ist mein projects_controler.rb

class ProjectsController < ApplicationController 
    before_action :set_project, only: [:show, :edit, :update, :destroy] 
    before_action :authenticate_user! 

    def create 
    @project = Project.new(project_params) 
    @task = Task.new(task_params) 

    respond_to do |format| 
     if @project.save and @task.save 
     format.html { redirect_to @project, notice: 'Project was successfully created.' } 
     format.json { render :show, status: :created, location: @project } 
     else 
     format.html { render :new } 
     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 @project, notice: 'Project was successfully updated.' } 
     format.json { render :show, status: :ok, location: @project } 
     else 
     format.html { render :edit } 
     format.json { render json: @project.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /projects/1 
    # DELETE /projects/1.json 
    def destroy 
    # @list = List.find(params[:id]) 
    @project.destroy 
    respond_to do |format| 
     format.html { redirect_to projects_url, notice: 'Project was successfully destroyed.' } 
    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(:title, :description, :done, :user_id) 
    end 



    def set_task 
     @task = Task.find(params[:id]) 
    end 

    def task_params 
     params.require(:task).permit(:title, :done, :project_id) 
    end 
end 

Projekt.

rb
class Project < ApplicationRecord 
    belongs_to :user, foreign_key: "user_id" 
    has_many :tasks , dependent: :destroy 
    validates_presence_of :user 
    validates_uniqueness_of :title, on: :create, message: "must be unique" 
    validates :title, presence: true, length: { minimum: 2 } 

    def done_tasks 
    tasks.where(done: true).order("updated_at DESC") 
    end 
end 

task.rb

class Task < ApplicationRecord 
    belongs_to :project, foreign_key: "project_id"#, class_name: "List" 
    validates_presence_of :title 

    def completed? 
    !completed_at.blank? 
    end 
end 

routes.rb

Rails.application.routes.draw do 

    devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" } 

    resources :projects do 
     resources :tasks 
    end 


    authenticated :user do 
    root to: 'projects#index' 
    end 
    unauthenticated :user do 
    root 'welcome#home' 
    end 
end 

new.html.erb

<h1>New Project</h1> 

<%= render 'form', project: @project, task: @task %> 
<%# render 'form', project: @project, task: @task %> 

    <!-- custom --> 
    <!-- shall I ADD ID TO THE projrct t be trackable by the task????? and describe that in task.rb --> 
    <!-- <h1>Tasks</h1> --> 
    <%# f.button %> 
<!-- button to add a new task --> 
<%# f.button "add a new task to the current project" %> 

<!-- if else mechanism for adding a new task via a button --> 
<!-- when button pressed, tasks/_form will appear down here --> 
<!-- button to save the task while at the same moment ..... override "create task" and "create project" to save "save project to task" --> 

<%# render '../tasks/_form' %> 

<%= link_to 'Back', projects_path %> 

_form.html.erb

<%= simple_form_for(@project, @task) do |f| %> 
<%# form_for([@post, @comment]) do |f| %> 

    <% f.error_notification %> 

    <div class="form-inputs"> 
    <%= f.input :title %> 
    <%= f.input :description %> 
    <%= f.input :done %> 
    <%= f.association :user %> 
    </div> 



    <div class="form-actions"> 
    <%= f.button :submit %> 
    </div> 
<% end %> 
+0

Verwenden Sie [verschachtelte Attribute] (http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html). – max

+0

Ich habe die Modelle und die Routen hinzugefügt. –

+0

Sie müssen Ihr Modell so einrichten, dass verschachtelte Attribute akzeptiert werden. –

Antwort

0

In task_params

params.require(:task).permit(:title, :done) 

und create-Methode wie

sein sollte
def create 
    @project = Project.new(project_params) 
    @project.tasks.build(task_params) 

    respond_to do |format| 
    if @project.save and @task.save 
     format.html { redirect_to @project, notice: 'Project was successfully created.' } 
     format.json { render :show, status: :created, location: @project } 
    else 
     format.html { render :new } 
     format.json { render json: @project.errors, status: :unprocessable_entity } 
    end 
    end 
end 
+0

Vielen Dank :) ... aber jetzt nach dem Hinzufügen der '[]' Zeichen zu meiner new.html.erb bekomme ich undefinierte Methode "Schlüssel" für # . Ich habe versucht, die 'foreign_key'-Zeile in meinen Projekten und Aufgabenmodellen (aber nicht meine Benutzer) auskommentieren. Ich denke, ich muss eine "Schlüssel" -Methode in meinem Projektmodell implementieren, aber ich kann nicht herausfinden, wie. @loki @ Ahmed Magdy –

Verwandte Themen