0

モデルメソッドを書くことの背後にある基本を理解するのに苦労しています。これは、これを機能させるために必要なことだと思います。基本的に、そのプロジェクトに属する project_todos を表示するプロジェクト ビューがあります。次に、project_todo に属する project_todo_comments を入れ子にします。すべてを 1 つのビューに。

has_manyproject_todos、project_todobelongs_toプロジェクト、project_todo_commentsがプロジェクトになるように関連付けを設定しましたhas_many。それからもちろん 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

これで、プロジェクトに Todo を追加して表示できるようになりました。また、プロジェクトの Todo にコメントを追加して表示することも、すべて同じビューで行うことができます。しかし、コメントが関連付けられている todo のみを表示するのに苦労しています。現在、任意の todo にコメントを追加すると、すべての todo にそのコメントが表示されます。

ビューでは、ここに 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

ただし、フォーム (コメントを作成する場所) では、todo アイテムに間違った 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 に答える