0

我正在努力掌握编写模型方法背后的基础知识,我认为我需要做些什么才能让它发挥作用。基本上,我有一个项目视图,它显示属于该项目的 project_todos。然后嵌套在我有属于 project_todo 的 project_todo_comments 之下。全部在一个视图中。

我已经建立了关联,以便项目has_manyproject_todos、project_todobelongs_to项目和has_manyproject_todo_comments。然后当然是 project_todo_comment belongs_toproject_todo。

在项目控制器中,我正在这样做:

  def show
    @project = Project.find(params[:id])

    # Display the form to create a new todo
    @project_todo = ProjectTodo.new

    # Create the instance variable to display the loop in the view
    @todos = @project.project_todos

    # Display the form to create a new comment
    @project_todo_comment = ProjectTodoComment.new

     # Create the instance variable to display the loop in the view
    @comments = @project.project_todo_comments

    respond_to do |format|
      format.html # show.html.erb
      format.json { render :json => @project }
    end
  end

因此,我可以在项目中添加待办事项并显示它们,我还可以向项目待办事项添加注释并显示它们,所有这些都在同一个视图中。但是,我很难让评论仅显示与它们相关联的待办事项。现在,当我对任何待办事项添加评论时,每个待办事项都会显示该评论。

在视图中,我在这里显示 project_todos 并嵌套表单以添加评论,然后显示评论:

 <% @todos.each do |todo| %>
    <p><%= todo.title %></p>

    <%= form_for(@project_todo_comment) do |f| %>
        <%= f.hidden_field :project_todo_id, :value => @project_todo.id %>
        <%= f.hidden_field :project_id, :value => @project.id %>
        <%= f.text_area :comment %>
        <%= f.submit 'Add Comment' %>
    <% end %>

    <% @comments.each do |comment| %>
        <%= comment.comment %>
    <% end %>

  <% end %>

有人告诉我,我需要编写一个模型方法才能使其正常工作,但我仍在努力理解这些。谁能保证我确实需要编写一个模型方法,并指出我了解它们的方向?谢谢!

4

1 回答 1

1

在您的控制器中,您可以获得所有评论,但在实际todo项目中,您只需要该项目的评论。这可以通过以下方式完成:todo.project_todo_comments
最简单的解决方法:

- <% @comments.each do |comment| %>
-   <%= comment.comment %>
- <% end %>

+ <% todo.project_todo_comments.each do |comment| %>
+   <%= comment.comment %>
+ <% end %>

您可以从控制器中删除该行:

- @comments = @project.project_todo_comments

但是,在您的表单(您创建评论的地方)中,您为待办事项使用了错误的 ID:

- <%= f.hidden_field :project_todo_id, :value => @project_todo.id %>
+ <%= f.hidden_field :project_todo_id, :value => todo.id %>

顺便说一句,我只想为这些模型命名: Todo而且Comment,使用那么长的模型名没有意义。您在模型开始时定义这些关联,因此如果有人阅读它,他/她会立即看到它。

例如看看我自己,我知道你的模型的目的是什么仍然滥用命名,导致类名过长。

于 2012-12-14T15:14:55.757 回答