Создавать и показывать элементы в представлении samve - PullRequest
1 голос
/ 28 ноября 2010

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

При представлении формы для создания новой задачи в текущем проектепеременная @tasks, содержащая задачи, которые должны отображаться в списке ниже, кажется пустой.Поэтому я получаю «Нет совпадений маршрутов», так как объект, который я передаю, т.е.complete_project_task_path равен nil.

При удалении формы все работает как шарм.Есть идеи, почему это происходит?

<h1>Listing tasks</h1>

<%= form_for([@project, @project.tasks.build]) do |f| %>
    <div id="new_quick_task">
        <%= f.text_field :title, :value => 'Quickly add a new task' %>
        <%= f.submit %>
    </div>
<% end %>

<div id="task_list">
    <% @tasks.each do |task| %>

        <div class="task">
            <div class="completed"><%= task.completed %></div>
            <div class="complete_link"><%= link_to "Good", complete_project_task_path(@project, task) %></div>
            <div class="title"><%= link_to task.title, project_task_path(@project, task) %></div>
        </div>
    <% end %>
</div> <!-- end task_list -->

Ответы [ 2 ]

1 голос
/ 29 ноября 2010

Почему вы используете @tasks, а не @project.tasks? потому что это покажет новую задачу, которую вы создали для своей формы?

Ну, вы все еще можете использовать @project.tasks и сделать что-то вроде:

<% @project.tasks.each do |task| %>
  <% unless task.title.nil? %>
    <div class="task">
        <div class="completed"><%= task.completed %></div>
        <div class="complete_link"><%= link_to "Good", complete_project_task_path(@project, task) %></div>
        <div class="title"><%= link_to task.title, project_task_path(@project, task) %></div>
    </div>
  <% end %>
<% end %>

, который пропустит задачи без заголовка.

Ошибка, которую вы получаете не потому, что переменная @tasks пуста, потому что если бы она была, вы бы никогда не пришли к коду под ней. Вы получаете ошибку, что один из элементов в вашем @tasks содержит значение, которого он не ожидает. Я думаю, это как-то связано с вашим complete_project_task_path(@project, task), который проверит что-то из task, которое установлено неправильно?

0 голосов
/ 29 ноября 2010

Так что я думаю, что понял это. (поправьте меня, если я не прав)

Переменные Ruby содержат ссылки на объекты и оператор = копирует ссылки.

(из http://ruby -doc.org / docs / Newcomers / ruby.html # objects № 17)

Принимая это во внимание, посмотрите на следующий пример

@task_list = @project.tasks

По существу, @task_list ссылается на тот же объект, что и @project.tasks. Если данные в @project.tasks изменяются, изменяются и данные @task_list's, поскольку они оба указывают на один и тот же объект.

@project.tasks.build, кажется, изменяет объект, на который как-то указывают @project.taks и @task_list.

Решение было довольно простым. Вместо установки @task_list = @ project.tasks я создал новый объект для @ task_list.

Итак, в контроллере вместо этого нужно:

@project = Project.find(params[:project_id])
@task_list = @project.tasks

просто сделайте это так:

@project = Project.find(params[:project_id])
@taks_list = Task.where(:project_id => @project.id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...