2016-04-02 2 views
0

Итак, я изучаю рельсы, написав несколько простых приложений, и в этом приложении у меня есть два типа объектов: Задачи и Projects.Sense заключается в том, что все эти объекты могут быть созданы пользователем, пользователем должно быть в состоянии управлять им и так on.Each задачей belongs_to проекта и проект has_many tasks.But, когда я создаю новый проект - это уже все задачи из всех других проектов, так как это выглядит: enter image description hereСоздайте объект с правильным ID в Rails 4

Это «123 Задача была создана путем простого добавления задачи в «Проект», но та же задача все еще появляется в «Another project». Как я могу исправить эту ошибку и сделать мою задачу уникальной? Я думаю, что что-то должно быть добавлено к модели задач или проектов, Знаю, что я должен добавить.

Вот соответствующие контроллеры: 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 = Task.new(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 
    @task.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 set_task 
     @task = Task.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def task_params 
    params.require(:task).permit(:deadline, :name, :project_id) 
end 
end 

projects_controller.rb

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

    # GET /projects 
    # GET /projects.json 
    def index 
    @projects = Project.all 
    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 = Project.new(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 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(:name) 
    end 
end 

И соответствующие взгляды: для задач

<% @tasks.each do |task| %> 
    <div class="row task"> 
    <div class="col-xs-12"> 
     <div class="col-xs-1 checkbox"> 
     <%= check_box_tag 'accept' %> 
     </div> 
     <div class="col-xs-8 taskbody"> 
     <%= task.name %> 
     </div> 
    <div class="mini-glyph"> 
     <div class="col-xs-1"> 
     <span class="glyphicon glyphicon-arrow-up"></span> 
     <span class="glyphicon glyphicon-arrow-down"></span> 
     </div> 
     <div class="col-xs-1"> 
     <%= link_to edit_task_path(task) do %> 
      <span class="glyphicon glyphicon-pencil"></span> 
     <% end %> 
     </div> 
     <div class="col-xs-1"> 
     <span><%= link_to " ", task, method: :delete, data: { confirm: 'Are you sure?' }, class:"glyphicon glyphicon-trash" %></span> 
     </div> 
    </div> 
    </div> 
</div> 
<% end %> 

И для проектов:

<div class="container"> 
    <% @projects.each do |project| %> 
    <div class="projectblock"> 
    <div class="row project-bar"> 
     <div class="col-xs-12 "> 
     <div class="col-xs-1"> 
      <span class="glyphicon glyphicon-list-alt"></span> 
     </div> 
     <div class="col-xs-9 prname"> 
      <%= project.name %></td> 
     </div> 
     <div class="col-xs-1"> 
      <%= link_to edit_project_path(project) do %> 
      <span class="glyphicon glyphicon-pencil"></span> 
      <% end %> 
     </div> 
     <div class="col-xs-1"> 
      <span><%= link_to " ", project, method: :delete, data: { confirm: 'Are you sure?' }, class:"glyphicon glyphicon-trash" %></span> 
     </div> 
     </div> 
    </div> 
     <div class="row add-task-bar"> 
     <div class="input-bar col-xs-12 "> 
     <div class="glyphicon glyphicon-plus col-xs-1 left_plus" ></div> 
     <div class="col-xs-10" > 
      <div class="input-group"> 
      <input type="text" class="form-control" placeholder="Start typing here to create a task..."> 
      <span class="input-group-btn"> 
       <button class="btn btn-default" type="button"><%= link_to 'Add task', new_task_path %></button> 
      </span> 
      </div> 
     </div> 
     </div> 
    </div> 
    <div class="col-xs-8 taskbody"> 
<% project.tasks.each do |task| %> 
    <%= @task.name %> 
<% end %> 
</div> 
</div> 
    <% end %> 
</div> 
    <div class="row text-center"> 
    <div class="col-xs-4"></div> 
     <div class="todo-btn col-xs-4"> 
     <a href="projects/new" class="btn"> 
      <span class="glyphicon glyphicon-plus"></span> 
      Add TODO list 
     </a> 
    </div> 
</div> 

Я знаю, что прошу об этом во второй раз, но последний вопрос не был полностью удовлетворен из-за моей ошибки - я просто не могу понять, где именно я должен вставить эту «Task.where (project_id : project_id) " Поэтому я вынужден просить совет снова

Project.rb

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

Task.rb

class Task < ActiveRecord::Base 
    belongs_to :project 
end 

ответ

1

Ваша проблема, кажется, здесь:

<%= render :template => 'tasks/index' %> 

Вы не показывайте свой код, но в основном вы оказываете все свои задачи, от индекса, который я предполагаю, просто вызывает все задачи.

То, что вы хотите сделать, это заменить это что-то вроде:

<% project.tasks.each do |task| %> 
    <%= task.name %> <%= task.whatever_else_xx %> 
<% end %> 

Я не положил их в формат, но вы можете просто обернуть HTML, как требуется, и я не использовал частично, что вы, возможно, захотите сделать, и я предположил, что проект - это то, что ваш объект проекта заполняется как, и он содержит has_many: задачи, но вы должны получить эту идею.

Вы на самом деле не нужно делать Tasks.where, рельсы активная запись будет заботиться о нем для вас, однако я заметил, эта линия может быть немного проблематичным:

params.require(:task).permit(:deadline, :name) 

При создании задачи, необходимо установить столбец project_id, который должна иметь ваша база данных, если вы использовали миграцию - это устанавливает родительский проект для заданной задачи.

params.require(:task).permit(:deadline, :name, :project_id) 

, и вы должны убедиться, что это отправлено в виде скрытого поля ..Вы можете вручную проверить, работает ли приведенный выше код, вручную добавив project_id, который вам нужен для строки задачи, но для новых задач должен быть отправлен идентификатор.

+1

Подробнее о классе Проект Tim

+0

Я добавил свои модели, но (извините, если я буду раздражать), вы имели в виду, что я могу оставить все эти «где» и оставить контроллер как есть, просто изменив соответствующее представление? – Mikhah

+0

И еще жаль снова за этот нарушенный комментарий – Mikhah