2017-01-20 2 views
0

Ici j'ai un projet auquel j'ajoute une session et pour une session de projet j'essaye d'ajouter la tâche. je suis capable de créer le projet et ajouter la session de projet pour le projet mais quand j'essaye d'ajouter la tâche pour la session utilisant project_sessions_id j'obtiens erreur Couldn't find ProjectSession with 'id'= et 'app/controllers/tasks_controller.rb:60:in set_project_session je peux obtenir l'identification de session de projet également project_sessions/11 dans l'url mais quand je clique 'créer une tâche' je reçois cette erreur. Comment puis-je résoudre ça?Impossible de trouver ProjectSession avec 'id' =

voici ce que je l'ai fait

ProjectSessionController:

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

    def index 
    @project_sessions = ProjectSession.all 
    end 

    def show 
    @project_sessions = ProjectSession.where(project_id: @project.id).order("created_at DESC") 
    end 

    def new 
    @project_session = ProjectSession.new 
    end 

    def edit 
    end 

    def create 
    @project_session = ProjectSession.new(project_session_params) 
    @project_session.project_id = @project.id 

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

    def update 
    respond_to do |format| 
     if @project_session.update(project_session_params) 
     format.html { redirect_to @project_session, notice: 'Project session was successfully updated.' } 
     format.json { render :show, status: :ok, location: @project_session } 
     else 
     format.html { render :edit } 
     format.json { render json: @project_session.errors, status: :unprocessable_entity } 
     end 
    end 
    end 


    def destroy 
    @project_session.destroy 
    respond_to do |format| 
     format.html { redirect_to project_sessions_url, notice: 'Project session was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_project_session 
     @project_session = ProjectSession.find(params[:id]) 
    end 

    def set_project 
     @project = Project.find(params[:project_id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def project_session_params 
     params.require(:project_session).permit(:session_date, :session_name, :session_description, :start_time, :end_time) 
    end 
end 

contrôleur de tâches:

class TasksController < ApplicationController 
    before_action :set_task, only: [:show, :edit, :update, :destroy] 
    before_action :authenticate_user! 
    before_action :set_project_session 

    def index 
    @tasks = Task.all 
    end 

    def show 
    end 

    def new 
    @task = Task.new 
    end 

    def edit 
    end 

    def create 
    @task = Task.new(task_params) 
    @task.session_id = @project_session.id 

    respond_to do |format| 
     if @task.save 
     redirect_to @project_session 
     else 
     format.html { render :new } 
     format.json { render json: @task.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def update 
    respond_to do |format| 
     if @task.update(task_params) 
     format.html { redirect_to @task, notice: 'Task was successfully updated.' } 
     format.json { render :show, status: :ok, location: @task } 
     else 
     format.html { render :edit } 
     format.json { render json: @task.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def destroy 
    @task.destroy 
    respond_to do |format| 
     format.html { redirect_to tasks_url, notice: 'Task was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

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

    def set_project_session 
     @project_session = ProjectSession.find(params[:project_session_id]) 
    end 

    def task_params 
     params.require(:task).permit(:name, :description) 
    end 
end 

routes:

Rails.application.routes.draw do 
     get 'hr_dashboard/index' 
     resources :roles 
     resources :project_sessions 
     devise_for :users 
     resources :tasks 
     resources :projects do 
     resources :project_sessions, except: [:show, :index] 
     end 
     resources :project_sessions do 

    resources :tasks, except: [:show, :index] 
    end 
    authenticated :user do 
    root 'admindashboard#index', as:"authenticated_root" 
    end 
    root 'welcome#index' 
    get 'userdashboard/index' 
    get 'admindashboard/index' 
    get 'welcome/index' 
end 

View pour créer une nouvelle tâche

<div class="container"> 
<h1>New Task</h1> 


<%= form_for(@task) do |f| %> 
    <% if @task.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@task.errors.count, "error") %> prohibited this task from being saved:</h2> 

     <ul> 
     <% @task.errors.full_messages.each do |message| %> 
     <li><%= message %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
    <%= f.label :name %><br> 
    <%= f.text_field :name %> 
    </div> 
    <div class="field"> 
    <%= f.label :description %><br> 
    <%= f.text_area :description %> 
    </div> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 


<%= link_to 'Back', tasks_path %> 
</div> 
+0

Pouvez-vous poster vos itinéraires –

+0

@ j-dexx J'ai mis à jour le poste avec les routes .. –

+0

Ok, donc vos itinéraires sont imbriqués, pouvez-vous fournir le code de vue pour le lien s'il vous plaît. –

Répondre

1

Dans votre action de créer contrôleur de tâches, vous devez ajouter:

@task= @project_session.tasks.build(task_params) 

Parce qu'en ce moment, vous ne dites pas la tâche, de construire à partir du project_session (ou par rapport à la project_session) vous lui dites simplement de créer une nouvelle tâche.

@task = Task.new 

Et dans le fichier routes.rb, vous avez préparé pour que cela se produise en imbriquant les ressources, il cherche actuellement l'ID d'une tâche qui belongs_toproject_session. Mais n'en trouve pas.

Et aussi, dans votre élément form_for lors de la création d'un ProjectSssion vous avez laissé cette forme savoir quelle route il devrait appartenir à - Je suppose que vous pourriez dire - puisque vous avez encore les ressources emboîtés ONU-disponibles:

resources :tasks 

Si les sessions de projet ne doivent pas être créables sans parent, il n'y a aucune raison de garder cela, vous devriez donc simplement le supprimer.

Quoi qu'il en soit, voici ce que le form_for devrait ressembler à:

<%= form_for([@project_session, @task]) do |f| %> 
+0

Une tâche appartient à une session de projet, vous avez expliqué que faire si les sessions de projet appartenaient à une tâche. –

+0

J'ai mis à jour ma réponse pour référence future. Merci d'avoir fait remarquer cela. – Crashtor

1

I figured it out!

J'avais oublié d'ajouter @project_session dans

<%= form_for([@project_session, @task]) do |f| %> 

venez d'ajouter que et cela a fonctionné.